Android相机Intent返回null求助:修改后数据突然为空
Android相机调用onActivityResult中data返回null的排查方案
核心原因分析
当你启动相机Intent时传入了MediaStore.EXTRA_OUTPUT参数指定图片保存路径,绝大多数相机应用会将图片直接写入你指定的imageUri,不会在返回的Intent data中携带缩略图或图片数据,这就是data为null的直接原因。
具体修复步骤
1. 修改onActivityResult判断逻辑
移除data != null的判断,直接使用启动Intent时传入的imageUri加载图片:
@Override public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == UserVisitDetailActivity.RESULT_OK){ // 直接用启动时指定的imageUri加载图片 checkInHolder.setImageURI(imageUri); } }
2. 确保imageUri的合法性
启动Intent前,要保证imageUri是正确创建的,尤其要适配Android 7.0及以上版本的FileProvider:
// 示例:创建临时图片文件并生成合规Uri File imageFile = createImageFile(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { imageUri = FileProvider.getUriForFile(this, "你的应用包名.fileprovider", imageFile); } else { imageUri = Uri.fromFile(imageFile); }
注:使用FileProvider需在AndroidManifest.xml中注册,并配置file_paths.xml路径
3. 删除冗余的缩略图处理逻辑
因为已通过EXTRA_OUTPUT指定保存路径,无需再从data中获取缩略图并重新生成Uri,直接删除以下代码:
Bitmap photo = (Bitmap) data.getExtras().get("data");- 调用
getImageUri()的相关代码
4. 验证权限配置
确保已申请必要权限:
- Android 10及以下:
WRITE_EXTERNAL_STORAGE权限 - Android 11及以上:无需申请外部存储权限(使用FileProvider或应用私有目录即可)
兼容特殊相机应用的补充方案
部分小众相机应用可能不遵守规范,仍会返回data,可保留兼容判断:
if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == UserVisitDetailActivity.RESULT_OK){ if(data != null){ // 兼容返回缩略图的特殊相机应用 Bitmap photo = (Bitmap) data.getExtras().get("data"); imageUri = getImageUri(getApplicationContext(), photo); } // 优先使用指定的Uri加载图片 checkInHolder.setImageURI(imageUri); }
内容的提问来源于stack exchange,提问作者Anthony Rafael
相关产品推荐
相关产品推荐

