数日前、Crashlytics が、私の Google Play Services Location API 実装内で奇妙なクラッシュを報告し始めました。Google Play Services API が接続された後、FusedLocationApi.getLastLocation(...) を使用して最後の既知の場所を取得しようとしましたが、この呼び出しはセキュリティ例外で終了し、それを行うための適切な権限がないことを伝えます (スタック トレースを参照)下)
私には実行時のアクセス許可があり、このコードはほとんどのデバイスで数か月間動作します。このエラーは主に OnePlus One で発生し、Android 6 を搭載した HTC One M8 で再現できました。
問題は最新の Google Play サービスの更新に関連していると思いますが、これを検証できませんでした。このエラーは、デバイスの位置情報サービスが無効になっている場合にのみ発生します (実際には、Google Play サービスから位置情報の許可が自動的に削除されます)。これらのデバイスの最新の再生サービスには、セキュリティ例外をスローするバグがあり、Google Play サービスにはありません。私のアプリは位置データにアクセスしますが、アクセス許可。
似たような問題が発生していて、より良い解決策を見つけた人はいませんか?{}問題に関するすべてまたは Google からの最新情報をキャッチしてみてください。{}
アップデート:
Android 6.0 を搭載した HTC One M8 でこれを再度テストすることができました。位置情報サービスが有効な状態で SecurityException もスローされ、アプリと再生サービスへのアクセス許可が付与されます。BALANCED_POWER と HIGH_ACCURACY を切り替えても、例外メッセージが
位置情報操作を実行するには、クライアントに ACCESS_COARSE_LOCATION または ACCESS_FINE_LOCATION 権限が必要です。
ファイルアクセス許可には問題がなく、Android LocationManager を使用するフォールバック実装は SecurityException をスローしませんが、位置サービスが gps のみに設定されている場合にのみ位置が決定されます。
興味深い事実: Google マップを使用すると、Google Play Services が数秒ごとにクラッシュし、場所が見つかりません。GPS を有効にするナビゲーションのみが場所を見つけることができます。
要約 すると、Google Play サービス 9.2.56 (438-124593566) を搭載した HTC One M8 (Android 6.0 ソフトウェア番号 6.12.401.4) には、GPS のみではない位置情報サービスに関する一般的な問題があります。Google Play Services FusedLocationApi には、アクセス許可システムに問題があり、アクセス許可が与えられますが、SecurityException がスローされます。古い LocationManager 実装を使用してもセキュリティ上の問題はありませんが、デバイス設定が gps のみに設定されている場合にのみ位置を特定できます。
スタックトレース:
Fatal Exception: java.lang.SecurityException: Client must have ACCESS_FINE_LOCATION permission to request PRIORITY_HIGH_ACCURACY locations.
at android.os.Parcel.readException(Parcel.java:1620)
at android.os.Parcel.readException(Parcel.java:1573)
at com.google.android.gms.location.internal.zzi$zza$zza.zza(Unknown Source)
at com.google.android.gms.location.internal.zzk.getLastLocation(Unknown Source)
at com.google.android.gms.location.internal.zzl.getLastLocation(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.internal.zznt$zza.zzre(Unknown Source)
at com.google.android.gms.internal.zzoc.connect(Unknown Source)
at com.google.android.gms.internal.zzoc.zzd(Unknown Source)
at com.google.android.gms.internal.zzoh.zzd(Unknown Source)
at com.google.android.gms.internal.zzof.zzd(Unknown Source)
at com.google.android.gms.location.internal.zzd.getLastLocation(Unknown Source)
at com.my.package.location.PlayServicesLocationFinder.onConnected(PlayServicesLocationFinder.java:74)
at com.google.android.gms.common.internal.zzl.zztI(Unknown Source)
at com.google.android.gms.internal.zzof.zzc(Unknown Source)
at com.google.android.gms.internal.zzod.zzsb(Unknown Source)
at com.google.android.gms.internal.zzod.begin(Unknown Source)
at com.google.android.gms.internal.zzoh.zzc(Unknown Source)
at com.google.android.gms.internal.zznw.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzk$1.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzd$zzj.zzl(Unknown Source)
at com.google.android.gms.common.internal.zzd$zza.zztp(Unknown Source)
at com.google.android.gms.common.internal.zzd$zza.zztp(Unknown Source)
at com.google.android.gms.common.internal.zzd$zze.zztr(Unknown Source)
at com.google.android.gms.common.internal.zzd$zzd.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:5461)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)