Expo SDK46中expo-image-picker授权通过仍提示权限被拒问题
解决Expo SDK 46 + expo-image-picker 13.3.1相机权限报错问题
排查步骤与解决方案
1. 补全权限检查流程
别只申请权限,调用相机前必须主动校验权限状态——哪怕系统显示权限已开启,Expo权限模块可能存在状态不同步的情况:
import { Platform, PermissionsAndroid } from 'react-native'; import * as ImagePicker from 'expo-image-picker'; // 跨平台权限请求 async function getCameraPermission() { if (Platform.OS === 'android') { const status = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.CAMERA, { title: "相机权限申请", message: "应用需要访问相机来拍照", buttonPositive: "允许" } ); return status === PermissionsAndroid.RESULTS.GRANTED; } else { const { status } = await ImagePicker.requestCameraPermissionsAsync(); return status === 'granted'; } } // 调用相机的正确流程 async function openCamera() { const hasPermission = await getCameraPermission(); if (!hasPermission) { alert('需要开启相机权限才能使用'); return; } const result = await ImagePicker.launchCameraAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: false, base64: false, }); // 处理返回结果 }
2. 核对app.json权限配置
Expo项目必须在app.json中声明权限,SDK46的安卓端需要单独配置:
{ "expo": { "permissions": ["CAMERA", "CAMERA_ROLL"], "android": { "permissions": ["android.permission.CAMERA"] }, "ios": { "infoPlist": { "NSCameraUsageDescription": "应用需要访问相机拍摄照片" } } } }
- 安卓:根级
permissions可能不生效,必须在android.permissions里单独加相机权限 - iOS:
NSCameraUsageDescription不能为空,否则系统会直接拒绝权限请求
3. 清理缓存重建项目
缓存会导致权限状态不同步,执行以下操作:
- 打开Expo Go,进入设置页面清除客户端缓存
- 项目根目录运行
expo r -c清除项目缓存 - 若是裸项目,执行
expo prebuild --clean后重新构建
4. 确认系统权限实际状态
去设备设置里找到你的应用,手动检查相机权限是否为「允许」状态——有时候系统权限会被意外重置,或者Expo模块没有正确读取系统状态。
内容的提问来源于stack exchange,提问作者DavidY
相关产品推荐
相关产品推荐

