【问题标题】:How to know if location permission is granted "Allow all the time"如何知道位置权限是否被授予“始终允许”
【发布时间】:2019-12-15 11:00:02
【问题描述】:

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

允许 APP 访问此设备的位置吗?

-一直允许

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

-拒绝

有没有办法知道究竟是如何被授予的?我使用此代码来了解是否授予位置:

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

但我需要知道它是“一直”还是“在使用应用程序时”被授予的。 我真正需要的是始终获得许可,因为我的应用程序具有后台定位服务。因此,我需要知道是否已授予该权限,或者是否有可能要求该权限,但没有“仅在使用应用程序时”允许它的选项。

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

【问题讨论】:

    标签: android permissions


    【解决方案1】:

    你可以使用:

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

    如果不让用户选择“仅在使用应用程序时”选项,就不可能提示用户。

    【讨论】:

    • 另见this;您无法摆脱“仅在使用应用程序时允许”选项,但您可以摆脱另一个选项。
    • 那不是真的这个结果返回到允许所有时间和只在使用应用程序时允许,所以你不能只检查这种方式。
    【解决方案2】:

    截至 2021 年 7 月 18 日,根据 @gkpln3 的回答,它不是返回布尔值而是返回整数值,因此在 Kotlin 中添加了一个小型布尔转换器

    val backgroundLocationPermissionApproved: Boolean = ActivityCompat.checkSelfPermission(requireContext(),
                    Manifest.permission.ACCESS_BACKGROUND_LOCATION) > -1
    

    【讨论】:

    • 我认为您应该与常量 PackageManager.PERMISSION_GRANTED 进行比较。
    【解决方案3】:

    你可以使用这个方法,我在android level 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");
        }
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 2014-10-01
      • 2020-03-13
      • 2021-07-03
      相关资源
      最近更新 更多