Fragment中拍照回调报错:onActivityResult内Intent为空致崩溃
解决拍照后
onActivityResult中Intent为空的问题 这问题我当初做相机功能时也踩过坑!别慌,这其实不是你的代码写错了,而是大部分系统相机应用的正常行为——它们在拍照完成后并不会把图片数据通过Intent返回(毕竟图片体积可能很大,Intent传数据有大小限制),只会返回RESULT_OK的结果码,而照片已经按照你之前指定的路径保存好了,所以这时候onActivityResult里的Intent自然是空的。
具体解决步骤:
- 首先确认你的
REQUEST_TAKE_PHOTO请求码在startActivityForResult和onActivityResult中是完全一致的,避免请求码不匹配导致的问题。 - 在
onActivityResult方法里,不要依赖传入的Intent来获取图片,直接去你调用takePicture()时指定的照片保存路径读取文件即可。
举个代码示例:
假设你在takePicture()里是这样指定保存路径的:
private File createImageFile() throws IOException { // 创建唯一的图片文件名 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* 前缀 */ ".jpg", /* 后缀 */ storageDir /* 存储目录 */ ); // 保存文件路径,后续用来读取图片 mCurrentPhotoPath = image.getAbsolutePath(); return image; } private void takePicture() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 确保有相机应用能处理这个Intent if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // 创建保存图片的文件 File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { // 处理文件创建失败的异常 ex.printStackTrace(); } // 如果文件创建成功,把文件URI放入Intent if (photoFile != null) { Uri photoURI = FileProvider.getUriForFile(this, "com.yourpackage.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); } } }
那在onActivityResult里就可以直接用mCurrentPhotoPath来读取图片:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { // 这里不用管data(Intent)是否为空,直接从保存的路径加载图片 try { Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath); // 把bitmap设置到ImageView或者做后续处理 imageView.setImageBitmap(bitmap); } catch (Exception e) { e.printStackTrace(); } } }
额外注意事项:
- 如果你的应用目标SDK是Android Q(API 29)及以上,建议使用
MediaStore来保存图片,避免文件权限问题;如果是更低版本,要确保已经申请了WRITE_EXTERNAL_STORAGE权限(动态权限也要处理)。 - 有些第三方相机应用可能会有特殊行为,但按照这种路径读取的方式,基本能兼容绝大多数情况。
内容的提问来源于stack exchange,提问作者Vr33ni
相关产品推荐
相关产品推荐

