使用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
相关产品推荐
相关产品推荐

