android - 如何捕获位置权限的 SecurityException

标签 android google-play-services android-location

我在某些 API 6.0+ 设备上遇到以下崩溃:

Fatal Exception: java.lang.SecurityException: Client must have ACCESS_COARSE_LOCATION or ACCESS_FINE_LOCATION permission to perform any location operations.
       at android.os.Parcel.readException(Parcel.java:1693)
       at android.os.Parcel.readException(Parcel.java:1646)
       at com.google.android.gms.internal.zzed.zza(Unknown Source)
       at com.google.android.gms.internal.zzcda.zzdw(Unknown Source)
       at com.google.android.gms.internal.zzcdd.zzvQ(Unknown Source)
       at com.google.android.gms.internal.zzcdj.zzvQ(Unknown Source)
       at com.google.android.gms.location.zzf.zza(Unknown Source)
       at com.google.android.gms.internal.zzbaq.zza(Unknown Source)
       at com.google.android.gms.internal.zzbdd.zzb(Unknown Source)
       at com.google.android.gms.internal.zzbdd.zzqq(Unknown Source)
       at com.google.android.gms.internal.zzbdd.onConnected(Unknown Source)
       at com.google.android.gms.common.internal.zzaa.onConnected(Unknown Source)
       at com.google.android.gms.common.internal.zzn.zzj(Unknown Source)
       at com.google.android.gms.common.internal.zze.zzrj(Unknown Source)
       at com.google.android.gms.common.internal.zzi.zzrk(Unknown Source)
       at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source)
       at android.os.Handler.dispatchMessage(Handler.java:102)
       at android.os.Looper.loop(Looper.java:154)
       at android.os.HandlerThread.run(HandlerThread.java:61)

请注意,我在进行任何与位置相关的操作之前要求用户获得位置许可。但由于某些原因我无法重现,某些设备在我使用时似乎报告具有位置权限:

boolean hasPermission = ActivityCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;

因此,我需要能够捕获 SecurityException 并在它发生时忽略它。或者想出一种方法告诉用户手动启用位置权限。

当我开始使用来自 Play 服务的新 API 来使用 FusedLocationProviderClient 请求位置时,上述崩溃开始发生。当我尝试在没有磨碎的位置权限的情况下执行以下操作时,它会崩溃,例如:

LocationServices.getFusedLocationProviderClient(this).getLocationAvailability().addOnFailureListener(myListener);

不幸的是,故障监听器不会将崩溃发送到 myListener。用 try..catch 包围上面的内容也不起作用。即,这行不通,应用程序无论如何都会崩溃并抛出 SecurityException:

try {
    LocationServices.getFusedLocationProviderClient(this)
        .getLocationAvailability()
        .addOnFailureListener(myListener);
} catch(Exception e) {
    Log.e(e);
}

这个问题似乎与以下问题有关:

有什么想法吗?

最佳答案

您是否考虑过某些用户在您的应用启动后撤销权限这一事实?每次调用 FusedLocationProviderClient 中的任何方法之前,您都应该始终检查权限。

关于android - 如何捕获位置权限的 SecurityException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45014171/

相关文章:

java - Android requestLocationUpdates with GPS null

没有互联网的 Android 设备当前位置

android - 聚焦后更改 TextInputLayout 提示文本

android - 为什么位置服务是 Google Play 服务 APK 的一部分?

android - 将 Google Play 服务更新到版本 5.0(修订版 18)后 ProGuard 失败

android - 需要同步 onLocationChanged

android - 如何在 API 18 上设置 KeyPairGeneratorSpec 的 key 大小?

Android XMLparse 到 Arraylist

java - 将 Date 更改为设备本地时区的字符串

android - 更改特定对话框字体