Jedes Mal, wenn ich die Anwendung ausführe, wird meine SecurityException ausgelöst und der Fehler vom Debugger lautet wie folgt:
java.lang.SecurityException: Der Standortanbieter "gps" erfordert die Berechtigung ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION.
Dies scheint ein einfacher Fehler zu sein, meine Manifestdatei ist jedoch völlig korrekt. Hier ist es und hier ist auch mein MapActivity-Code:
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="com.dev.cromer.jason.coverme.permission.MAPS_RECEIVE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value= "@string/google_maps_key" />
<activity
android:name=".MapActivity"
android:label="@string/title_activity_map" >
</activity>
</application>
Meine Aktivität:
package com.dev.cromer.jason.coverme;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapActivity extends FragmentActivity implements LocationListener {
private GoogleMap mMap; // Might be null if Google Play services APK is not available.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_map);
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
//mMap.setMyLocationEnabled(true);
//mMap.setOnMyLocationChangeListener(this);
setUpMap();
}
}
}
private void setUpMap() {
mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
mMap.setMyLocationEnabled(true);
LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
try {
Location myLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
if (myLocation != null) {
Log.d("TAG", "Not null");
}
else {
Log.d("TAG", "NULL");
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
}
catch (SecurityException se) {
Log.d("TAG", "SE CAUGHT");
se.printStackTrace();
}
}
@Override
public void onLocationChanged(Location location) {
Log.d("CHANGED", "LOCATION UPDATED");
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
Antworten:
ACCESS_COARSE_LOCATION
,,ACCESS_FINE_LOCATION
undWRITE_EXTERNAL_STORAGE
sind alle Teil des Laufzeitberechtigungssystems für Android 6.0 . Sie müssen sie nicht nur wie Sie im Manifest haben, sondern auch zur Laufzeit vom Benutzer anfordern (usingrequestPermissions()
) und prüfen, ob Sie sie haben (usingcheckSelfPermission()
).Eine kurzfristige Problemumgehung besteht darin, Ihre
targetSdkVersion
unter 23 zu senken .Schließlich möchten Sie jedoch Ihre App aktualisieren, um das Laufzeitberechtigungssystem zu verwenden.
Diese Aktivität funktioniert beispielsweise mit fünf Berechtigungen. Vier sind Laufzeitberechtigungen, obwohl derzeit nur drei verarbeitet werden (ich habe sie geschrieben, bevor sie
WRITE_EXTERNAL_STORAGE
zur Liste der Laufzeitberechtigungen hinzugefügt wurden).(aus diesem Beispielprojekt )
Ich würde die oben definierten Konstanten verwenden
Manifest.permission
, wie oben gezeigt.Dies wird als erster Parameter an an Sie zurückgegeben
onRequestPermissionsResult()
, sodass Sie einenrequestPermissions()
Anruf von einem anderen unterscheiden können.quelle
targetSdkVersion
auf 23 oder höher einzustellen . Zu diesem Zeitpunkt müssen Sie das Laufzeitberechtigungssystem übernehmen. Bis dahin können Sie IhretargetSdkVersion
unter 23-Werte beibehalten und die Laufzeitberechtigungen ignorieren.Meine einfache Lösung ist dies
oder Sie können den Berechtigungsdialog in einem anderen Fall öffnen
quelle
URSACHE: "Ab Android 6.0 (API-Stufe 23) erteilen Benutzer Apps Berechtigungen, während die App ausgeführt wird, und nicht, wenn sie die App installieren." In diesem Fall ist "ACCESS_FINE_LOCATION" eine "gefährliche Berechtigung". Aus diesem Grund erhalten Sie die 'java.lang.SecurityException: Der Standortanbieter "gps" benötigt die Berechtigung ACCESS_FINE_LOCATION.' Fehler ( https://developer.android.com/training/permissions/requesting.html ).
LÖSUNG: Implementieren des Codes unter https://developer.android.com/training/permissions/requesting.html unter den Überschriften "Fordern Sie die erforderlichen Berechtigungen an" und "Behandeln Sie die Antwort auf die Berechtigungsanforderung".
quelle