Android拍照后onActivityResult中Intent对象为空问题求助
解决相机拍照后onActivityResult中Intent为空的问题
嘿,这个问题我太熟悉了!当你通过MediaStore.EXTRA_OUTPUT指定了图片保存路径后,系统相机应用不会把图片的Uri或数据放到返回的Intent data里,这就是为什么你拿到的data是null——这是Android相机Intent的设计逻辑,不是bug。
问题根源
当你给相机Intent传入MediaStore.EXTRA_OUTPUT参数时,相机应用会直接把拍摄的图片写入你指定的Uri地址,不会再通过返回的Intent传递任何图片相关数据,所以onActivityResult里的data自然就是空的。你不需要从data里取Uri,直接用你之前创建的那个file Uri就可以了。
解决方案步骤
- 保存拍摄图片的Uri:在调用相机的Fragment里定义一个成员变量,用来存储你创建的图片Uri,这样拍照完成后就能直接复用它。
- 修改
onActivityResult逻辑:去掉对data != null的判断,直接使用保存好的Uri来处理后续逻辑。
修改后的代码示例
第一步:在Fragment中添加成员变量存储Uri
// 作为Fragment的成员变量,保存拍摄图片的Uri private Uri mCapturedImageUri;
第二步:修改调用相机的代码(保存Uri)
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); File outputFile = Utilities.getOutputMediaFile(); // 保存生成的Uri mCapturedImageUri = Uri.fromFile(outputFile); camera.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageUri); startActivityForResult(camera, Constants.IMAGE_CAPTURE_CAMERA);
第三步:修改Fragment的onActivityResult方法
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // 处理相机拍照返回 if (requestCode == Constants.IMAGE_CAPTURE_CAMERA && resultCode == Activity.RESULT_OK) { // 直接用之前保存的mCapturedImageUri,不用管data ProfilePicUri = mCapturedImageUri; Log.d("ImageUri", "onActivityResult: " + ProfilePicUri); performCrop(); } // 处理图库选择返回(这里data是有值的,正常判断) else if (requestCode == Constants.IMAGE_CAPTURE_GALLERY && resultCode == Activity.RESULT_OK) { if (data != null) { Uri galleryUri = data.getData(); // 你的图库图片处理逻辑 } } }
额外提醒(针对Android 7.0+)
如果你的应用运行在Android 7.0及以上系统,直接用Uri.fromFile()会触发FileUriExposedException。这时候需要用FileProvider来生成安全的Uri:
- 在
AndroidManifest.xml中配置FileProvider。 - 用
FileProvider.getUriForFile()替换Uri.fromFile()。 - 给相机Intent添加读写权限:
camera.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); camera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
内容的提问来源于stack exchange,提问作者Vineeth Mohan
相关产品推荐
相关产品推荐

