Android 处理用户拒绝了权限,并勾选了不再询问

2,344 阅读1分钟

这是项目中很常见的一个需求,运行时弹出授权弹框,用户拒绝了权限,并且勾选了不再询问,接下来该如何处理,弹出一个对话框,提醒用户不授权无法使用该应用,然后跳转到系统设置界面中授权。

用到shouldShowRequestPermissionRationale()这个方法,但是它在以下几种情况下会返回 true或 false:

  • true: 用户之前拒绝了权限请求,但并未勾选“不再询问”。

  • false:

    • 用户之前拒绝了权限请求,并勾选了“不再询问”。
    • 权限从未被请求过。
    • 权限已经被授予。

方法shouldShowRequestPermissionRationale()返回false时有多种情况,需要我们自己处理,首先判断权限已经被授予。

ContextCompat.checkSelfPermission(this, Manifest.permission.XXX) !=
        PackageManager.PERMISSION_GRANTED

返回true表示没有授权。

接着判断权限从未被请求过,在权限回调方法中onRequestPermissionsResult()使用SP存储一个boolean类型的标识,true表示权限被请求过,false表示权限从未被请求过。

override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<String?>,
    grantResults: IntArray
) {
    if (requestCode == REQUEST_CODE) {
        SP.putBoolean(
            "key",
            true
        )
    }
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}

之前的两步已经排除了权限已经被授予,权限从未被请求过这两种情况,那么剩下的就只有一种情况了,那就是用户之前拒绝了权限请求,并勾选了“不再询问”,

上完整代码

ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA),
                CAMERA_REQUEST_CODE
            )

直接上代码,

private fun checkPermission(isOpenSetPer: Boolean = false): Boolean {

    return if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
        PackageManager.PERMISSION_GRANTED
    ) {
        if (!SP.getBoolean("key", false)) {
            // 权限从未被请求过。
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.XXX),
                REQUEST_CODE
            )
            
        } else if (!ActivityCompat.shouldShowRequestPermissionRationale(
                this,
                Manifest.permission.XXX
            )
        ) {
            //用户之前拒绝了权限请求,并勾选了“不再询问”。
            if (isOpenSetPer) {
                showPermissionConfirmDialog()
               
            }
        } else {
            //用户之前拒绝了权限请求,但并未勾选“不再询问”。
            ActivityCompat.requestPermissions(
                this,
                arrayOf(Manifest.permission.CAMERA),
                CAMERA_REQUEST_CODE
            )
           
        }

        false
    } else {
        
        true
    }
}