Expo 37.0.12使用expo-image-picker-multiple多图选择权限报错问题
Expo Android多图选择权限报错排查与解决方案
排查方向
- 检查
app.json中安卓权限声明是否完整:Expo 37要求所有用到的原生权限必须在配置中提前声明,未声明的权限调用请求会直接返回失败。 - 检查权限调用逻辑是否符合API规范:Expo 37的
Permissions.askAsync不支持同时传入多个不同分组的权限枚举,混合传入相机、相册、存储权限会直接触发报错。 - 检查运行设备的安卓系统版本:Android 13(API 33)及以上版本采用了新的媒体权限拆分机制,Expo 37内置的权限适配逻辑无法正常映射,会出现权限获取失败。
修复方案
- 补全
app.json权限配置
在app.json的expo.android.permissions数组中添加如下权限声明:
{ "expo": { "android": { "permissions": [ "CAMERA", "READ_EXTERNAL_STORAGE", "WRITE_EXTERNAL_STORAGE" ] } } }
修改后执行expo start --clear清除缓存重启项目,打包的话需要重新构建安卓安装包生效。
- 拆分权限请求逻辑,添加错误捕获
不要一次性请求多个不同类型的权限,拆分请求步骤,同时捕获异步错误避免出现未处理的Promise拒绝:
try { // 按需请求相机权限(不需要拍照可跳过) const cameraRes = await Permissions.askAsync(Permissions.CAMERA); if (cameraRes.status !== 'granted') { alert('请授予相机权限后重试'); return; } // 请求相册存储权限 const storageRes = await Permissions.askAsync(Permissions.CAMERA_ROLL); if (storageRes.status !== 'granted') { alert('请授予存储权限后重试'); return; } // 权限获取成功,调用多图选择逻辑 } catch (err) { console.error('权限请求异常', err); }
- 适配高版本安卓系统
如果运行设备是Android 13及以上版本,可选择两种适配方案:- 升级Expo版本到46及以上,配套升级多图选择库到对应兼容版本,适配新的媒体权限机制
- 在安卓构建配置中将
targetSdkVersion降到32以下,规避新权限校验逻辑
- 调整依赖库版本
当前使用的expo-image-picker-multiple@1.4.0存在对Expo 37的权限适配缺陷,可降级到1.3.0版本解决兼容问题。
内容的提问来源于stack exchange,提问作者NotEnuf
相关产品推荐
相关产品推荐

