Expo-image-picker在Android应用重启后无法调用相机问题求助
Expo Image Picker在Android 15上重启应用后相机无法打开的问题
问题描述
- 全新安装应用后,相机可正常打开使用
- 重启应用后,相机无法打开,无崩溃现象,Logcat也没有相关异常日志
- 仅在系统设置中清除应用数据后,相机才能再次正常使用
当前环境
- Expo SDK 52
- Android 15
- 依赖库:expo-image-picker
已尝试的解决措施
- 添加了所有必要权限:
CAMERA、READ/WRITE_EXTERNAL_STORAGE - 调整expo配置中的插件顺序,将
expo-image-picker置于首位 - 测试了多个版本的expo-image-picker
可能的解决方案
1. 主动检查并重新请求权限
Android 15对权限持久化的处理逻辑有更新,重启后权限状态可能未正确保留。在应用启动时主动检查相机权限,若未授权则重新请求:
import * as ImagePicker from 'expo-image-picker'; import { useEffect } from 'react'; async function checkAndRequestCameraPermission() { const { status } = await ImagePicker.getCameraPermissionsAsync(); if (status !== 'granted') { const { status: updatedStatus } = await ImagePicker.requestCameraPermissionsAsync(); if (updatedStatus !== 'granted') { alert('需要授予相机权限才能使用拍照功能'); } } } // 在应用根组件的useEffect中调用 useEffect(() => { checkAndRequestCameraPermission(); }, []);
2. 清理缓存并重新构建项目
缓存可能导致配置异常,执行以下命令清理并重建:
npx expo prebuild --clean npx expo run:android
3. 更新权限声明适配Android 15
Android 13及以上版本已废弃WRITE_EXTERNAL_STORAGE,改用针对性的媒体权限。确保AndroidManifest.xml中的权限声明正确:
<uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
注意:可在app.json的android.permissions中手动声明所需权限,确保覆盖正确配置。
4. 锁定兼容的expo-image-picker版本
确认使用的版本与Expo SDK 52完全兼容,SDK 52对应的expo-image-picker稳定版本为~15.0.7,在package.json中锁定该版本:
{ "dependencies": { "expo-image-picker": "~15.0.7" } }
之后执行npm install或yarn install更新依赖。
临时规避方法
如果上述方案暂时无法解决问题,可以在相机启动失败时,引导用户前往应用设置重新授予权限:
async function openCamera() { try { const pickerResult = await ImagePicker.launchCameraAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, allowsEditing: true, quality: 0.8, }); if (!pickerResult.canceled) { // 处理选中的图片 } } catch (err) { alert('相机无法打开,请前往应用设置检查并重新授予相机权限'); } }
内容的提问来源于stack exchange,提问作者Said Pc
相关产品推荐
相关产品推荐

