安卓Play服务FusedLocationAPI的getLastLocation崩溃并提示安全异常

7
几天前,Crashlytics开始报告我在Google Play服务位置API实现中的奇怪崩溃。连接Google Play服务API后,我尝试使用FusedLocationApi.getLastLocation(...)获取上次已知位置,但此调用以安全异常结束,告诉我我没有正确的权限进行操作(请参见下面的堆栈跟踪)
我确实拥有运行时权限,并且这段代码在大多数设备上工作了几个月。这个错误主要发生在OnePlus One上,我可以在安卓6.0的HTC One M8上重现它。
我认为问题与最新的Google Play服务更新有关,但我无法验证这一点。只有在设备位置服务被禁用时才会出现此错误(实际上会自动从Google Play服务中删除位置权限),因此我认为这些设备上的最新Play服务存在一个错误,该错误会抛出安全异常,因为Google Play服务没有访问位置数据的权限,尽管我的应用程序有。
是否有人遇到类似的问题,或者找到了比try {} catch整个过程更好的解决方案,或者Google对该问题有任何更新?
更新:
我可以在安卓6.0的HTC One M8上再次测试此功能,并且即使启用了位置服务并授予了应用和Play服务权限,也会抛出SecurityException。在BALANCED_POWER和HIGH_ACCURACY之间切换没有任何效果,除了将异常消息更改为“客户端必须具有ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限才能执行任何位置操作。”
文件访问权限没有问题,我的备用实现使用Android LocationManager不会抛出SecurityException,但仅当位置服务设置为仅gps时才确定位置。
有趣的事实:当使用Google Maps并且找不到位置时,Google Play服务每隔几秒钟崩溃。只有启用GPS的导航才能找到位置。
总之,HTC One M8(软件版本6.12.401.4的安卓6.0)和Google Play服务9.2.56(438-124593566)存在与位置服务不是仅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)

https://dev59.com/fFwY5IYBdhLWcg3waXS5 - CommonsWare
我已经请求了权限,并且可以保证我有请求FINE和CORSE_LOCATION的权限。 - marilion91
@TimCastelijns 我测试了一台安装原版ROM、没有任何修改的HTC One M8手机。Google Play服务版本为9.2.56(438-....)。不幸的是,我的同事不得不提前离开,这是他的设备。 - marilion91
我有一部原装的OnePlus手机,并确认了Play服务和一些依赖应用程序的异常。关于权限黑客,目标是解决电池耗尽问题,在此之前它运行良好。 - juherr
这个问题已经在这里报告了:gmaps-api-isses issues 10166 - Richard Le Mesurier
显示剩余4条评论
1个回答

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接