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

