You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Activity Result APIs调用TakePicture拍照时Activity销毁致APP崩溃如何解决?

问题根源

从崩溃堆栈可以明确,本次报错并非来自你使用的Activity Result APIs,而是你代码中保留的旧onActivityResult方法(MyActivity第269行)里,直接对一个空的ArrayList执行了get(0)操作导致的索引越界。新Activity Result APIs使用自动生成的请求码,不会用到堆栈中显示的请求码1,进一步验证了崩溃来源于旧的回调逻辑。

解决方案

1. 清理/修复旧的onActivityResult逻辑

你切换到新的Activity Result APIs后,没有删除旧的onActivityResult重写方法,系统触发结果回调时仍会执行该方法。你可以直接删除无用的旧逻辑,或者给列表访问添加非空校验:

// 原onActivityResult中的列表访问逻辑修改为:
if (targetList != null && !targetList.isEmpty()) {
    // 执行你的原有逻辑
    targetList.get(0);
}

2. 持久化拍照相关的临时变量

你当前将photoURI作为普通成员变量存储,当系统因内存不足销毁Activity后重建时,该变量会被重置为null。需要通过onSaveInstanceState保存状态,重建时恢复:

@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
    super.onSaveInstanceState(outState);
    if (photoURI != null) {
        outState.putString("saved_photo_uri", photoURI.toString());
    }
}

// 在onCreate中添加恢复逻辑
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 原有初始化逻辑不变
    if (savedInstanceState != null) {
        String uriStr = savedInstanceState.getString("saved_photo_uri");
        if (uriStr != null) {
            photoURI = Uri.parse(uriStr);
        }
    }
}

3. 可选冗余校验

你可以在Activity Result回调中添加结果成功判断,避免异常场景下的错误操作:

intentActivityResultLauncher=registerForActivityResult(new ActivityResultContracts.TakePicture(),
    result -> {
        if (result && firstImage != null && photoURI != null) {
            firstImage.setImageURI(photoURI);
        }
    });

内容的提问来源于stack exchange,提问作者Mena

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 07:27:01