如何知道位置权限是否已授权“始终允许”

13

在Android 10中,当请求某些权限(如位置)时,系统会提示用户3个选项:

允许应用程序访问此设备的位置?

-始终允许

-仅在使用该应用程序时允许

-拒绝

是否有办法知道已授予哪些权限?我使用以下代码来检查位置是否已授予:

boolean hasPermission = (ContextCompat.checkSelfPermission(oContext, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);

但我需要知道它是否已被授予“始终”或仅在“使用应用程序”时。 我真正需要的是一直拥有权限,因为我的应用程序具有后台位置服务。所以我需要知道是否已经授予了该权限,或者有没有可能请求该权限但无法只允许“仅在使用该应用程序时”。

requestPermissions(Context, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 123);
3个回答

5

您可以使用:

boolean backgroundLocationPermissionApproved =
       ActivityCompat.checkSelfPermission(this,
           permission.ACCESS_BACKGROUND_LOCATION)

没有办法在不让用户选择“仅在使用应用程序时”选项的情况下提示用户。


1
还可以参考这个;你无法摆脱“仅在使用应用程序时允许”选项,但可以摆脱另一个选项。 - greeble31
这不是真的,这个结果返回到“始终允许”和“仅在使用应用程序时允许”,所以你不能只检查所有时间这种方式。 - Umut ADALI

1
您可以使用这种方法,我已经在 Android 10 及以上版本上测试过:
private void checkLocationPermissionState(Context context){

int fineLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION);
int coarseLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {

    int bgLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION);

    boolean isAppLocationPermissionGranted = (bgLocation == PackageManager.PERMISSION_GRANTED) &&
            (coarseLocation == PackageManager.PERMISSION_GRANTED);

    boolean preciseLocationAllowed = (fineLocation == PackageManager.PERMISSION_GRANTED)
            && (coarseLocation == PackageManager.PERMISSION_GRANTED);

    if (preciseLocationAllowed) {
        Log.e("PERMISSION","Precise location is enabled in Android 12");
    } else {
        Log.e("PERMISSION","Precise location is disabled in Android 12");
    }

    if (isAppLocationPermissionGranted) {
        Log.e("PERMISSION","Location is allowed all the time");
    } else if(coarseLocation == PackageManager.PERMISSION_GRANTED){
        Log.e("PERMISSION","Location is allowed while using the app");
    }else{
        Log.e("PERMISSION","Location is not allowed.");
    }

} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {

    int bgLocation = ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_BACKGROUND_LOCATION);

    boolean isAppLocationPermissionGranted = (bgLocation == PackageManager.PERMISSION_GRANTED) &&
            (coarseLocation == PackageManager.PERMISSION_GRANTED);

    if (isAppLocationPermissionGranted) {
        Log.e("PERMISSION","Location is allowed all the time");
    } else if(coarseLocation == PackageManager.PERMISSION_GRANTED){
        Log.e("PERMISSION","Location is allowed while using the app");
    }else{
        Log.e("PERMISSION","Location is not allowed.");
    }
    
} else {

    boolean isAppLocationPermissionGranted = (fineLocation == PackageManager.PERMISSION_GRANTED) &&
            (coarseLocation == PackageManager.PERMISSION_GRANTED);

    if (isAppLocationPermissionGranted) {
        Log.e("PERMISSION","Location permission is granted");
    } else {
        Log.e("PERMISSION","Location permission is not granted");
    }
}

}


0
截至2021年7月18日,根据@gkpln3的答案,它不返回布尔值,而是返回整数值,因此在Kotlin中添加了一个小型布尔转换器。
val backgroundLocationPermissionApproved: Boolean = ActivityCompat.checkSelfPermission(requireContext(),
                Manifest.permission.ACCESS_BACKGROUND_LOCATION) > -1

1
我认为你应该与常量PackageManager.PERMISSION_GRANTED进行比较。 - Cícero Moura

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