react-native-permissions在Android端无法请求权限返回blocked如何解决
问题背景
开发React Native端权限申请功能时,在页面设置操作按钮,点击按钮触发权限检查与申请流程。
问题描述
项目使用react-native-permissions作为权限处理依赖,按照库官方文档指引编写Demo应用后,无法正常发起权限申请,权限请求返回结果为blocked。
- 复现现象:点击主界面的权限申请按钮后,权限申请弹出窗口会快速闪现后消失,直接返回主界面。
- 复现材料:包含主界面、权限弹窗两个步骤的截图,以及可复现问题的完整Demo代码仓库。
解决方案
react-native-permissions返回blocked状态,代表当前权限已被永久拒绝(用户曾勾选“不再询问”后拒绝权限),或原生端未正确配置权限声明,此时直接调用request方法无法唤起系统权限弹窗,就会出现弹窗闪一下立刻消失的现象,按以下步骤排查修复:
补全原生端权限配置
- Android端:打开
android/app/src/main/AndroidManifest.xml,在<manifest>标签下添加你要申请的对应权限声明,例如申请相机权限需添加:
未在清单文件中声明的权限,调用申请接口会直接返回<uses-permission android:name="android.permission.CAMERA" />blocked。Android 13+注意权限拆分:存储权限替换为READ_MEDIA_IMAGES/READ_MEDIA_VIDEO/READ_MEDIA_AUDIO,通知权限需单独声明POST_NOTIFICATIONS,不要使用旧版已废弃的权限字段。 - iOS端:打开
ios/[你的项目名]/Info.plist,添加对应权限的用途描述字段,例如申请相机权限需添加NSCameraUsageDescription,值为权限申请弹窗给用户看的用途说明,缺失该配置会导致权限申请直接失败返回blocked。
- Android端:打开
按权限状态分支处理逻辑,不要直接调用request
标准权限调用流程必须先检查状态,再对应处理,参考代码:import { check, request, openSettings, PERMISSIONS, RESULTS } from 'react-native-permissions'; // 以Android相机权限为例,iOS替换为PERMISSIONS.IOS下对应字段 const handlePermissionRequest = async () => { const status = await check(PERMISSIONS.ANDROID.CAMERA); switch (status) { case RESULTS.DENIED: // 状态为DENIED时才能正常唤起系统申请弹窗 const reqResult = await request(PERMISSIONS.ANDROID.CAMERA); // 自行处理授权后的业务逻辑 break; case RESULTS.GRANTED: case RESULTS.LIMITED: // 已获得授权(含iOS有限授权场景),直接执行业务逻辑 break; case RESULTS.BLOCKED: // BLOCKED状态无法唤起系统弹窗,直接引导用户跳转到应用设置页手动开启权限 await openSettings(); break; case RESULTS.UNAVAILABLE: // 当前设备不支持该硬件能力,比如设备无摄像头 break; } }测试环境重置
如果之前测试时已经点击过“拒绝且不再询问”,直接卸载应用重装,或进入系统设置-应用管理找到对应Demo,手动重置所有权限状态后再重新测试即可。
内容的提问来源于stack exchange,提问作者Trify
相关产品推荐
相关产品推荐

