android - 如何使用新的 ActivityResultContracts 类检查 "Never ask again"权限场景?

标签 android android-permissions

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

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

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

最佳答案

遗憾的是,Android API 不允许我们检测用户何时通过旧 Android 版本中的“不再询问”复选框拒绝权限或在较新的 Android 版本(即 Android 11 台以上设备)。

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

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

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

只要有点聪明,我们就可以绕过 Android API 的限制,让我们自己区分上述两种情况。看我的回答here有关如何执行此操作的示例。

关于android - 如何使用新的 ActivityResultContracts 类检查 "Never ask again"权限场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68808234/

相关文章:

android - 棉花糖存储和图库使用的读写权限

java - Android 6.0 多权限

java - 拒绝设置中的权限

Android 应用程序将所需的权限转换为功能

android - Android 中的 XMPP 聊天 : ChatManager not resolved

android - 系统如何识别哪个应用程序正在发送请求?

Android 更改屏幕亮度。为此需要特别许可吗?

android - iOS 上的 CSS 与 Android 上的不同吗?

java - 什么是最大线程 sleep 时间?

android - MapOverlay 就像 PopUp 一样