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

Raj*_*Raj 9 android android-permissions android-11

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

权限窗口有“拒绝”、“全部允许”、“仅允许本次”三个选项。但在设置中存在“拒绝”、“始终允许”、“每次询问”。

如何查找用户何时从设置中选择“每次询问我”,because、checkSelfPermission()returnPackageManager.PERMISSION_DENIEDshouldShowRequestPermissionRationale()return false。这次我想显示权限窗口,而不是移动到设置。类似于谷歌地图权限的东西

Kar*_*kar 10

使用新的 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
                }
            }
        }

Run Code Online (Sandbox Code Playgroud)

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

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        requestPermissionLauncher.launch(REQUIRED_PERMISSIONS)
    }
Run Code Online (Sandbox Code Playgroud)

按以下方式询问 requiredPermissions:

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

Run Code Online (Sandbox Code Playgroud)

  • 如果用户关闭权限对话框,这将不起作用。 (3认同)
  • 这里有什么被拒绝的其他解释,请分享您的进口 (2认同)