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