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

Android应用点击相机页面关闭按钮返回时崩溃问题排查

问题根因

触发崩溃的直接原因是onActivityResult生命周期方法的判断逻辑顺序错误,空安全校验缺失:
当你在相机页面点击X按钮取消拍照返回时,系统返回的参数满足两个特征:

  • requestCode 等于你发起拍照时传入的CAMERA_REQUEST_CODE
  • resultCode 为RESULT_CANCELED,返回的Intent data为null,不存在任何返回数据
    你当前的代码优先判断requestCode匹配后,完全没有校验操作结果状态、data是否为空,直接执行data.getExtras().get("data"),在空对象上调用方法就会抛出你看到的异常:

java.lang.NullPointerException: Attempt to invoke virtual method
'java.lang.Object android.os.BaseBundle.get(java.lang.String)' on a
null object reference.

你写在else分支的finish()根本没有执行机会——空指针崩溃在进入相机分支的第一行就已经触发了。

修复代码

直接替换原有onActivityResult方法的全部逻辑即可:

@Override
protected void  onActivityResult(int requestCode,int resultCode,Intent data){
    super.onActivityResult(requestCode,resultCode,data);
    // 非成功结果直接返回,不执行后续业务逻辑,无需调用finish关闭当前页
    if (resultCode != RESULT_OK) {
        return;
    }
    // 处理拍照返回
    if(requestCode == CAMERA_REQUEST_CODE){
        // 双重空校验兜底,避免极端场景下的空指针
        if (data != null && data.getExtras() != null) {
            Bitmap image = (Bitmap) data.getExtras().get("data");
            imageView.setImageBitmap(image);
        }
    } 
    // 处理相册选图返回
    else if(requestCode == 3 && data != null){
        Uri selectedImage = data.getData();
        imageView.setImageURI(selectedImage);
    }
}
额外优化点
  • 移除原逻辑里取消操作就调用finish()的代码:用户取消拍照/选图时应该停留在当前页面,直接finish会违背正常交互逻辑
  • 原相册选图分支漏了requestCode校验,存在分支误判的隐患,修复版本已经补上对应判断
  • 原相册分支里重复调用findViewById(R.id.displaypickedimage)属于冗余操作,直接使用onCreate阶段初始化好的全局imageView实例即可
  • 代码里相机按钮的idpick_image_camara存在拼写错误(正确拼写为camera),建议后续修正,避免维护时出现id匹配错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:51:19