Expo SDK47中Expo-Image-Picker在Android端无法正常工作求助
Expo ImagePicker 在 Android 设备返回全 undefined 问题排查方案
问题复现
使用 Expo SDK47 + Expo-Image-Picker 时,iOS 端选择图片功能正常,但三星、华为等 Android 设备选择图片后,返回对象的所有属性均为 undefined,返回示例如下:
Object { "assetId": undefined, "base64": undefined, "cancelled": undefined, "exif": undefined, "height": undefined, "type": undefined, "uri": undefined, "width": undefined, }
当前使用的核心代码:
async function handleImage(){ try { let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, quality: 1, }); if (!result.cancelled) { setImage(result.uri); } console.log(result) } catch (error) { console.log(error) } }
排查与解决步骤
1. 补全 Android 权限配置
Android 13+ 新增了 READ_MEDIA_IMAGES 权限,需在 app.json/app.config.js 中添加配置:
{ "expo": { "android": { "permissions": [ "READ_MEDIA_IMAGES", "CAMERA" // 若用到相机功能需添加 ] } } }
同时在代码中主动请求权限:
import { PermissionsAndroid, Platform } from 'react-native'; async function requestPermissions() { if (Platform.OS === 'android') { const permission = await PermissionsAndroid.request( PermissionsAndroid.PERMISSIONS.READ_MEDIA_IMAGES ); return permission === PermissionsAndroid.RESULTS.GRANTED; } return true; } // 修改 handleImage 先校验权限 async function handleImage(){ try { const hasPermission = await requestPermissions(); if (!hasPermission) { console.log('存储权限被拒绝'); return; } let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, quality: 1, }); if (!result.cancelled) { setImage(result.uri); } console.log(result) } catch (error) { console.log(error) } }
2. 锁定适配 SDK47 的 ImagePicker 版本
SDK47 对应的 Expo ImagePicker 稳定版本为 ~14.0.2,确认 package.json 中的版本后重新安装:
"expo-image-picker": "~14.0.2"
执行安装命令:
npm install expo-image-picker@~14.0.2 # 或使用 yarn yarn add expo-image-picker@~14.0.2
3. 检查国产 Android 系统的存储权限策略
部分国产系统(如华为鸿蒙、三星 One UI)有特殊存储限制,需手动开启应用的「访问所有文件」权限:
- 进入系统设置 → 应用管理 → 找到你的应用 → 权限管理 → 存储 → 选择「允许访问所有文件」
4. 添加完整的 ImagePicker 配置参数
尝试补充 allowsEditing 和 aspect 参数,避免因配置缺失导致异常:
let result = await ImagePicker.launchImageLibraryAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, quality: 1, allowsEditing: false, aspect: [4, 3], });
5. 清除缓存并重建项目
# 清除 Expo 缓存并重启项目 expo r -c # 若为裸项目,清除 Node 模块后重建 rm -rf node_modules package-lock.json npm install expo prebuild --clean
内容的提问来源于stack exchange,提问作者KaganBerk
相关产品推荐
相关产品推荐

