Expo-image-picker调用launchCameraAsync()后Android应用崩溃问题
Expo Image Picker 低内存Android设备拍照崩溃排查及解决方案
核心诱因
该问题是Android低内存场景的典型异常:调用系统相机时应用退入后台,老款设备内存不足,系统会主动销毁应用所在的Activity释放资源,拍照结束返回应用时原有上下文、调用栈丢失,就会触发崩溃。
排查路径
- 接入Android Studio Logcat过滤应用包名,复现崩溃后查看崩溃栈,确认是否是空指针、上下文丢失类报错,还是组件本身抛出的异常
- 检查返回对象的取值逻辑是否有提前访问属性的问题
- 打开手机开发者选项中的不保留活动开关,在主流配置设备上复现问题,即可确认是进程回收导致的异常
修复方案
1. 修复代码逻辑缺陷
你当前的代码先访问result.uri再判断取消状态,如果用户取消拍照、进程销毁后返回空结果,直接访问属性就会触发崩溃,同时可以调整输出参数减少内存占用:
const take = async () => { try { let result = await ImagePicker.launchCameraAsync({ mediaTypes: ImagePicker.MediaTypeOptions.Images, // 老款设备不要用最高质量,减少图片生成和解析的内存占用 quality: 0.7, // 无需编辑则关闭,减少额外内存开销 allowsEditing: false, // 限制输出图片的最大宽高,避免加载大图触发OOM maxWidth: 1080, maxHeight: 1920 }); // 先校验结果合法性再访问属性,高版本expo-image-picker结果存放在assets数组中 if (result && !result.cancelled && result.assets?.length > 0) { const imageUri = result.assets[0].uri; setImageUri(imageUri); console.log(imageUri); } } catch (err) { // 捕获全局异常避免直接崩溃,可按需增加用户提示 console.error('拍照过程出错:', err); } };
2. 适配进程销毁场景
- 提前在进入拍照页之前申请好相机、存储权限,避免权限申请和相机调用同时触发带来的内存峰值
- 使用持久化存储方案保存当前页面的临时状态,Activity重建后可以恢复之前的操作上下文
- 如果使用的expo SDK版本低于46,升级到最新稳定版的expo-image-picker,旧版本组件本身存在结果处理的空指针漏洞
内容的提问来源于stack exchange,提问作者Ariadni Makari
相关产品推荐
相关产品推荐

