7

几天前,Crashlytics 开始在我的 Google Play 服务位置 API 实现中报告奇怪的崩溃。连接 Google Play 服务 API 后,我尝试使用 FusedLocationApi.getLastLocation(...) 获取最后一个已知位置,但此调用以安全异常结束,告诉我我没有执行此操作的正确权限(请参阅堆栈跟踪以下)

我确实拥有运行时权限,并且此代码在大多数设备上运行了几个月。此错误主要发生在 OnePlus One 上,我可以在装有 Android 6 的 HTC One M8 上重现它。

我认为这个问题与最新的谷歌播放服务更新有关,但我无法验证这一点。仅当设备位置服务被禁用时才会发生此错误(实际上会自动从 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 服务每隔几秒就会崩溃一次,并且找不到任何位置。只有启用 GPS 的导航才能找到位置。

总之 ,带有 Google Play 服务 9.2.56 (438-124593566) 的 HTC One M8(Android 6.0 软件编号 6.12.401.4)在定位服务方面存在一般问题,而不仅仅是 gps。Google Play 服务 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)
4

1 回答 1

4

现在应该在 Play Services 9.6 中修复https://developers.google.com/maps/documentation/android-api/releases#september_21_2016

2016 年 9 月 21 日
已解决的问题

  • 客户端必须具有 ACCESS_FINE_LOCATION 权限才能请求 PRIORITY_HIGH_ACCURACY 位置。(问题10166
于 2016-10-04T08:56:37.077 回答