React Native安卓端出现Unhandled promise rejection错误(E_MISSING_PERMISSION)
排查Android平台E_MISSING_PERMISSION错误的实用步骤
这种跨平台权限坑我之前踩过,别慌,咱们一步步拆解问题:
1. 先锁定核心问题:权限声明与动态申请
E_MISSING_PERMISSION的本质就是Android权限缺失,先从最基础的配置查起:
- 打开
android/app/src/main/AndroidManifest.xml,核对你用到的功能对应的权限有没有声明。比如用了相机、存储、定位的话,要加上这类代码:<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> - 划重点:Android 6.0(API 23)以上的危险权限,光在Manifest里声明没用,必须在代码里主动请求用户授权——别指望系统自动帮你处理。
2. 定位触发错误的源码位置
因为错误指向编译后的index.android.bundle,没法直接对应源码,试试这几个小技巧:
- 给所有异步操作加捕获:在你调用原生模块、访问硬件的Promise链末尾加上
.catch(err => console.error("权限错误追踪:", err)),打印完整错误栈,大概率能找到对应的源码文件和行号。 - 开启调试模式追断点:用Chrome的
chrome://inspect连接你的Android设备/模拟器,开启Source Map后,在Sources面板里找到你的源码,给Promise.reject或者权限相关API(比如requestPermissions)加断点,一步步追踪触发错误的逻辑。 - 排查第三方依赖:如果用了图片选择、地图这类第三方SDK,它们可能自带权限需求但没处理好。可以暂时注释掉这些依赖的调用,看错误是否消失,逐步定位问题库。
3. 检查权限申请的时机逻辑
- 一定要在调用需要权限的功能之前完成申请,比如别刚启动App就直接调相机,得先弹权限请求框,等用户同意后再执行逻辑。
- 可以用权限管理库(比如react-native-permissions)来简化流程,它会自动处理不同Android版本的兼容,还能返回清晰的权限状态(已授权/拒绝/永久拒绝)。
4. 清理缓存重新打包试试
有时候是打包缓存搞的鬼,执行这两步:
- 清理Android项目缓存:
cd android && ./gradlew clean - 重新构建运行:
npx react-native run-android --clean
如果还是卡壳,把完整的错误栈信息贴出来,或者说明你用到了哪些需要权限的功能,更容易精准定位~
内容的提问来源于stack exchange,提问作者Red
相关产品推荐
相关产品推荐

