如何使用新的 ActivityResultContracts 类检查“不再询问”权限场景?

问题描述 投票:0回答:2

新的 registerForActivityResult 方法使得请求权限变得非常简单,如下:

registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
    when {
        granted -> getUserLocation()
        else -> {
            //permission denied
        }
    }
}

但是,如何检测用户已通过“不再询问”复选框拒绝权限或在 Android 11+ 中永久拒绝权限?在这些情况下,我想将用户重定向到设备的“设置”屏幕?

android android-permissions
2个回答
1
投票

遗憾的是,Android API 不允许我们检测用户何时在较旧的 Android 版本中通过“不再询问”复选框拒绝了权限,或者在较新的 Android 版本(即 Android 11+)中两次(因此永久)拒绝了权限设备)。

专注于Android 11+,之所以上述不可能是因为Android API不允许我们区分以下两种情况:

  1. 用户从未拒绝过权限请求。
  2. 用户已拒绝权限请求两次

在这两种情况下, shouldShowRequestPermissionRationale(permission:) 方法返回

false
并且 checkSelfPermission(permission:) 方法返回 PackageManager.PERMISSION_DENIED.

只要发挥一点聪明才智,我们就可以解决 Android API 的限制,并允许我们自己区分上述两种情况。请参阅我的回答此处,了解如何执行此操作的示例。


0
投票

我建议将第一个拒绝视为“永远拒绝”,因为第一个拒绝可以通过 shouldShowRequestPermissionRationale() 检查。之后,您应该显示自己的对话框并将用户带到权限页面。

© www.soinside.com 2019 - 2024. All rights reserved.