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

使用Camera Intent拍照后data为null引发空指针异常的问题求助

嘿,我来帮你搞定这个拍照的空指针问题~

问题根源

你遇到的NullPointerException是因为当你通过MediaStore.EXTRA_OUTPUT指定了照片的保存路径后,系统相机不会把照片数据放到返回的Intent data里,所以data会是null,这时候调用data.getExtras()肯定会报错。

简单说:你用了指定保存路径的模式,就不能再从data里拿图片了,得直接从你之前存好的mCurrentPhotoPath里加载。

修复代码

把你的onActivityResult方法改成下面这样就行:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        // 直接从预先保存的路径加载图片,记得做压缩避免内存溢出
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 4; // 把图片压缩到原尺寸的1/4,可按需调整
        imgBitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, options);
        img.setImageBitmap(imgBitmap);
        // 补上你之前漏写的show()方法,不然Toast不会弹出
        Toast.makeText(getApplicationContext(), mCurrentPhotoPath, Toast.LENGTH_SHORT).show();
        
        // 可选:把照片同步到系统图库,方便用户在相册里找到它
        galleryAddPic();
    }
}

// 同步照片到系统图库的辅助方法
private void galleryAddPic() {
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
    File photoFile = new File(mCurrentPhotoPath);
    Uri contentUri = Uri.fromFile(photoFile);
    mediaScanIntent.setData(contentUri);
    this.sendBroadcast(mediaScanIntent);
}
额外提醒
  • 你之前的Toast代码漏了show()方法,所以不会弹出提示,我已经补上了~
  • 官方文档里其实明确说了:当指定EXTRA_OUTPUT时,返回的Intent不会携带图片数据,照片会直接写入你指定的文件。你之前混淆了两种拍照模式:一种是不指定路径,系统返回小缩略图到data.getExtras().get("data");另一种是指定路径,直接从路径读取全尺寸照片。
  • 加载图片时必须做压缩,不然高分辨率照片很容易导致内存溢出崩溃,上面的inSampleSize是最基础的压缩方式,你可以根据实际需求调整数值。

内容的提问来源于stack exchange,提问作者Luis Fernando Scripcaru

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:51:18