如何在 Android 11 中检测权限的永久拒绝?

Posted

技术标签:

【中文标题】如何在 Android 11 中检测权限的永久拒绝?【英文标题】:How to detect permission's permanent deny in Android 11? 【发布时间】:2021-10-24 15:57:16 【问题描述】:

android 11中,当用户对任何权限请求多次选择“拒绝”选项时,系统会将其标记为“永久拒绝”。一旦永久拒绝,用户必须在设置中启用。从这个时候@987654321 @开始的返回false

权限窗口有三个选项,“拒绝”,“允许所有时间”,“只允许这个时间”。但是在设置中“拒绝”、“始终允许”、“每次都询问”。

当用户从设置中选择“每次都问我”时如何查找,因为checkSelfPermission() 返回PackageManager.PERMISSION_DENIED,而shouldShowRequestPermissionRationale() 返回false。这次我想显示权限窗口,而不是移动到设置。 类似于谷歌地图权限的东西

【问题讨论】:

我认为这是故意行为,每当用户拒绝权限时,我都会显示 Toast 消息:“要重新激活此功能,请转到应用设置授予 XX 权限。” 【参考方案1】:

其实还有一种情况: 如果用户让您请求权限但未选择任何选项并通过点击外部关闭对话框,则请求以拒绝结束,shouldExplainPermissionRational() 返回 false。 这与用户选择不再询问的行为完全相同。 请求一次的权限,它会导致拒绝,我们不应该解释。

因此我们必须跟踪shouldExplainPermissionRational() 是否已经返回true 一次。如果它切换回 false ,则其被拒绝永久。

【讨论】:

【参考方案2】:

使用新的 ActivityResultsContract 您可以通过以下方式执行此操作


    private val requestPermissionLauncher =
        registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()
        )  result: MutableMap<String, Boolean> ->
            val deniedList: List<String> = result.filter 
                !it.value
            .map 
                it.key
            

            when 
                deniedList.isNotEmpty() -> 
                    val map = deniedList.groupBy  permission ->
                        if (shouldShowRequestPermissionRationale(permission)) DENIED else EXPLAINED
                    
                    map[DENIED]?.let 
                        // request denied , request again
                    
                    map[EXPLAINED]?.let 
                        //request denied ,send to settings 

                    

                
                else -> 
                   //All request are permitted
                
            
        

在 OnCreate()[确保你在 OnCreate 中请求权限,否则应用程序将崩溃],请求权限:

override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        requestPermissionLauncher.launch(REQUIRED_PERMISSIONS)
    

以下列方式询问 requiredPermissions :

private val REQUIRED_PERMISSIONS = arrayOf(
    Manifest.permission.CAMERA,
    Manifest.permission.READ_EXTERNAL_STORAGE
)

【讨论】:

工作。谢谢

以上是关于如何在 Android 11 中检测权限的永久拒绝?的主要内容,如果未能解决你的问题,请参考以下文章

flutter ios 照片权限总是返回权限被永久拒绝

当权限被永久拒绝时,Flutter permission_handler 包未打开应用程序设置

在小米 android 11 设备上,我们的 android 应用程序的忽略电池优化权限被拒绝

android createTempFile 抛出权限被拒绝?

访问文件 Android 11 时权限被拒绝

Android 11(R) 中的权限被拒绝问题