Android权限申请有何限制?两次拒绝读取联系人权限后不再弹出申请框
Android 读取联系人权限申请限制说明
Android 6.0(API 级别 23)引入的运行时权限机制对所有危险权限(包括READ_CONTACTS读取联系人权限)都有固定的申请限制,你遇到的两次拒绝后第三次不触发弹窗是系统的正常逻辑,具体规则如下:
- 首次申请权限时,系统弹窗仅提供「允许」「拒绝」两个选项
- 若首次申请用户选了拒绝,第二次申请时,弹窗会新增「不再询问」复选框
- 若用户连续两次选择拒绝,或是第二次拒绝时勾选了「不再询问」,后续你再调用
requestPermissions方法,系统会直接返回拒绝结果,不会再弹出权限申请窗口。
你当前的代码存在的问题是没有判断用户是否已经勾选了「不再询问」,直接在弹窗关闭时触发权限申请,就会出现无响应的情况。正确的处理逻辑需要配合shouldShowRequestPermissionRationale方法的返回值做判断:
该方法返回值的含义:
- 返回
true:用户之前拒绝过权限,但没有勾选「不再询问」,可以正常弹出权限申请- 返回
false:存在两种可能,要么是用户从未申请过该权限,要么是用户已经勾选了「不再询问」,此时不能再直接调用requestPermissions,需要引导用户到应用设置页手动开启权限。
参考实现代码:
when { ContextCompat.checkSelfPermission(mActivity, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED -> { // 已获取权限,执行业务逻辑 } shouldShowRequestPermissionRationale(Manifest.permission.READ_CONTACTS) -> { // 用户拒绝过但未勾选不再询问,弹说明后再申请 AlertDialog.Builder(mActivity) .setTitle("读取联系人权限申请") .setMessage("需要读取联系人权限才能使用对应功能,请授权") .setPositiveButton(android.R.string.ok) { _, _ -> requestPermissions(mActivity, arrayOf(Manifest.permission.READ_CONTACTS), 1) } .setNegativeButton(android.R.string.cancel, null) .show() } else -> { // 用户已勾选不再询问,引导跳转到设置页 AlertDialog.Builder(mActivity) .setTitle("权限申请被禁止") .setMessage("你已禁止读取联系人权限,请前往应用设置页手动开启") .setPositiveButton("去设置") { _, _ -> val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) val uri = Uri.fromParts("package", mActivity.packageName, null) intent.data = uri startActivityForResult(intent, 2) } .setNegativeButton(android.R.string.cancel, null) .show() } }
内容的提问来源于stack exchange,提问作者noob coder
相关产品推荐
相关产品推荐

