Ich habe einen seltsamen Fehler, während ich den Emulator NUR benutzt habe ... Ich habe eine Frage gefunden, die vor 9 Monaten das gleiche Problem ohne Antworten hatte ...
Ich benutze Google Play Services-Standorte, um Standorte in meiner App abzurufen. Ich bin mir meiner offensichtlichen Berechtigungen sicher. Alles funktioniert perfekt auf meinem Telefon. Das Problem tritt nur auf, wenn Sie einen Emulator verwenden Windows-Maschinen.
Ich bezweifle, dass Emulatoren diese grundlegende Funktion nicht unterstützen!
hier ist mein Manifest-Code:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.orderme.ordermeandroid" >
<uses-permission Android:name="Android.permission.INTERNET"></uses-permission>
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION"/>
und hier feuert die Ausnahme:
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient,mLocationRequest,this);
stack-Trace:
08-26 14:01:19.699 10157-10157/com.orderme.ordermeandroid E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.orderme.ordermeandroid, PID: 10157
Java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
at Android.os.Parcel.readException(Parcel.Java:1599)
at Android.os.Parcel.readException(Parcel.Java:1552)
at com.google.Android.gms.location.internal.zzg$zza$zza.zza(Unknown Source)
at com.google.Android.gms.location.internal.zzi.zza(Unknown Source)
at com.google.Android.gms.location.internal.zzj.zza(Unknown Source)
at com.google.Android.gms.location.internal.zzd$1.zza(Unknown Source)
at com.google.Android.gms.location.internal.zzd$1.zza(Unknown Source)
at com.google.Android.gms.common.api.zzc$zza.zzb(Unknown Source)
at com.google.Android.gms.common.api.zzf.zza(Unknown Source)
at com.google.Android.gms.common.api.zzf.zzb(Unknown Source)
at com.google.Android.gms.common.api.zzi.zzb(Unknown Source)
at com.google.Android.gms.location.internal.zzd.requestLocationUpdates(Unknown Source)
at com.orderme.ordermeandroid.Main.MainActivity.onConnected(MainActivity.Java:184)
at com.google.Android.gms.common.internal.zzk.zzh(Unknown Source)
at com.google.Android.gms.common.api.zzg.zznt(Unknown Source)
at com.google.Android.gms.common.api.zzg.onConnected(Unknown Source)
at com.google.Android.gms.common.api.zzi$2.onConnected(Unknown Source)
at com.google.Android.gms.common.internal.zzj$zzg.zzoD(Unknown Source)
at com.google.Android.gms.common.internal.zzj$zza.zzc(Unknown Source)
at com.google.Android.gms.common.internal.zzj$zza.zzs(Unknown Source)
at com.google.Android.gms.common.internal.zzj$zzc.zzoF(Unknown Source)
at com.google.Android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:148)
at Android.app.ActivityThread.main(ActivityThread.Java:5417)
at Java.lang.reflect.Method.invoke(Native Method)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:726)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
Meine Vermutung ist, dass Sie dies auf einem Android 6.0+ Emulator ausführen und eine targetSdkVersion
von 23 oder höher haben.
In diesem Fall sind ACCESS_COARSE_LOCATION
und ACCESS_FINE_LOCATION
Bestandteil von dem Android 6.0-Laufzeitberechtigungssystem . Überarbeiten Sie entweder Ihre App, um an diesem System teilzunehmen, oder legen Sie Ihre targetSdkVersion
unter 23 ab.
in Android 6.0 (API-Ebene 23) erteilen Benutzer Berechtigungen für Apps, während die App ausgeführt wird, nicht bei der Installation der App
So prüfen Sie, ob Sie die Berechtigung haben:
// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
Android.Manifest.permission.ACCESS_FINE_LOCATION);
So fordern Sie die erforderlichen Berechtigungen an:
if (ContextCompat.checkSelfPermission(thisActivity,
Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(thisActivity,
new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
// MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION is an
// app-defined int constant. The callback method gets the
// result of the request.
}
So greifen Sie auf das Ergebnis der Anfrage zu:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// permission was granted, yay! Do the task you need to do.
} else {
// permission denied, boo! Disable the functionality that depends on this permission.
}
return;
}
}
}
Quelle: http://developer.Android.com/training/permissions/requesting.html
Weitere Informationen zu Berechtigungen: https://guides.codepath.com/Android/Understanding-App-Permissions
Sie können den aktuellen Speicherort nicht vom Emulator abrufen. Sie können es aber auch emulieren, um Ihren Code zu testen. Hier finden Sie, wie Sie emulieren.
EDIT1: Es gibt eine Notiz hier
Hinweis: Wenn Sie sowohl NETWORK_PROVIDER als auch GPS_PROVIDER verwenden, müssen Sie nur die Berechtigung ACCESS_FINE_LOCATION anfordern, da sie die Berechtigung für beide Anbieter enthält. (Die Berechtigung für ACCESS_COARSE_LOCATION enthält nur die Berechtigung für NETWORK_PROVIDER.)
Sie sollten nur die Berechtigung ACCESS_FINE_LOCATION verwenden. Vielleicht hilft das.
Das Problem wurde durch eine neue Funktion für Android 6.0 verursacht. hoffe seine Arbeit ...
Ab Android 6.0 (API-Ebene 23) erteilen Benutzer Berechtigungen, während die App ausgeführt wird, nicht für die Installation der App.
http://developer.Android.com/training/permissions/requesting.html
Um das Problem zu umgehen, wenn die Berechtigung nicht explizit erteilt wird, hatte ich einen Check zum Einschließen von Standortdienstanrufen (gemäß der Google-Dokumentation, geringfügig geändert) aktiviert.
int permissionCheck = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
//Execute location service call if user has explicitly granted ACCESS_FINE_LOCATION..
}
In der Google-Dokumentation wird auch beschrieben, wie Sie die erforderlichen Berechtigungen anfordern.
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
bei einigen Manifestationen fehlt eine Zeile, die die Berechtigung von ACCESS_FINE_LOCATION erteilt. Sie müssen es also im Manifest erwähnen.
Ich habe das gemacht und mein Problem wurde gelöst.
Dies geschieht im Allgemeinen, weil wir die Berechtigung im Manifest erteilt haben, sodass die App ein Problem verursachen würde, da sie nicht auf die Berechtigungen zugreifen kann und die Datei abstürzt.
<?xml version="1.0" encoding="utf-8"?>
<uses-permission Android:name="Android.permission.ACCESS_FINE_LOCATION" />
<uses-permission Android:name="Android.permission.ACCESS_COARSE_LOCATION" />
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:supportsRtl="true"
Android:theme="@style/AppTheme" >
<activity Android:name=".MainActivity" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>