如何区分Android运行时权限的“不再询问”状态和“取消”状态
Android 两种shouldShowPermissionRationale() = false场景的区分方案
安卓系统本身没有提供直接的API区分「用户取消权限申请」和「用户选择不再询问(含Android 11+两次拒绝同一权限)」这两种状态,我们可以通过本地持久化标记+申请流程联动来实现区分,具体逻辑如下:
前置准备
在本地存储(SharedPreferences/MMKV等)中新增两个持久化标记:
permissionRequestCount:整型,默认值为0,记录当前权限的申请次数hasPermissionPermanentlyDenied:布尔型,默认值为false,记录是否已经触发永久拒绝
申请前判断逻辑
每次调用权限申请接口前,先做如下判断:
- 若已经拥有目标权限,直接走业务逻辑即可
- 若
shouldShowPermissionRationale()返回true:说明用户之前仅做过单次拒绝/取消操作,还未触发永久拒绝,直接调用requestPermissions()弹窗申请即可,同时将permissionRequestCount+1 - 若
shouldShowPermissionRationale()返回false:- 若
permissionRequestCount == 0:说明是首次发起申请,用户还没见过权限弹窗,当前返回值属于初始状态,直接调用requestPermissions()弹窗申请即可,同时将permissionRequestCount+1 - 若
permissionRequestCount >= 1:说明已经至少发起过一次申请,此时返回false就是触发了永久拒绝状态,直接跳转应用信息页引导用户手动授予权限即可
- 若
权限申请回调逻辑
在onRequestPermissionsResult回调中做如下处理:
- 若权限申请被授予:重置
permissionRequestCount为0、hasPermissionPermanentlyDenied为false,走正常业务逻辑 - 若权限申请被拒绝:
- 若当前
shouldShowPermissionRationale()返回true:说明用户只是本次取消/单次拒绝,未触发永久拒绝,无需额外修改标记,下次仍可正常弹窗申请 - 若当前
shouldShowPermissionRationale()返回false且permissionRequestCount >=2:标记hasPermissionPermanentlyDenied为true,后续申请直接走引导跳转逻辑即可
- 若当前
适配说明
Android 11及以上版本点击权限弹窗外侧、点击返回键取消申请的场景,不会计入「两次拒绝触发永久拒绝」的统计逻辑,上述方案可正常适配。
内容的提问来源于stack exchange,提问作者littledog
相关产品推荐
相关产品推荐

