如何捕获SecurityException以获取位置权限

时间:2017-07-10 14:05:33

标签: 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);
}

此问题似乎与以下问题有关:

有什么想法吗?

1 个答案:

答案 0 :(得分:-1)

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