You need to enable JavaScript to run this app. Expo-image-picker调用launchCameraAsync()后Android应用崩溃问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 19:24:02