Android相机Intent回调onActivityResult返回resultCode为0且Intent为空求助
排查Android相机拍照返回resultCode为0及data为空的问题
我来帮你梳理几个关键的排查方向,应该能解决你的问题:
一、先解决resultCode始终为0(RESULT_CANCELED)的问题
这个情况通常是相机无法正常完成拍照动作导致的,常见原因有这几个:
- 权限未正确申请:Android 6.0及以上版本,相机权限(
CAMERA)和存储相关权限需要动态申请。如果没有授权,相机App可能直接退出,返回取消状态。建议在启动相机前先检查权限,比如用ContextCompat.checkSelfPermission判断,未授权则调用ActivityCompat.requestPermissions申请。 - FileProvider配置不匹配:你代码里用了
FileProvider来获取Uri,必须确保AndroidManifest.xml里的provider配置和代码中的authority完全一致。比如代码里是getPackageName() + getString(R.string.authorities_fileprovider),那Manifest里的android:authorities属性值要和这个字符串完全相同,否则相机无法写入你指定的文件,会直接返回取消。 - 文件目录创建失败:虽然你调用了
imagesFolder.mkdirs(),但这个方法可能因为存储不可用、权限不足等原因返回false。建议加个判断日志,比如:
如果目录创建失败,相机没法保存照片,自然会返回取消。if (!imagesFolder.exists() && !imagesFolder.mkdirs()) { Log.e("CameraError", "Failed to create images folder"); return; } - 文件路径不合法:检查
createFileAtUniquePath方法生成的文件是否有合法后缀(比如.jpg),有些相机App要求必须指定图片格式的后缀才能正常保存。
二、解决data.getExtras()返回null的问题
这里有个关键知识点:当你给相机Intent设置了MediaStore.EXTRA_OUTPUT参数时,系统相机不会将照片Uri放在data的extras里!
因为你已经指定了照片的保存路径,相机App会直接把照片写入你提供的Uri对应的文件中,所以data可能为null,或者data.getExtras()里没有任何内容。你不需要从data里取Uri,而是直接使用你之前创建的那个Uri即可。
修改建议:
- 把保存照片的Uri设为类的成员变量:
private Uri mSavedImageUri; - 在启动相机前保存这个Uri:
mSavedImageUri = uriSavedImage; startActivityForResult(cameraIntent, REQUEST_CAMERA); - 在
onActivityResult里直接使用这个成员变量,跳过对data的依赖:@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { if (requestCode == REQUEST_CAMERA) { // 直接用预先保存的mSavedImageUri,不用data if (mSavedImageUri != null) { newAccountPhotoUri = mSavedImageUri; newAccountPhotoFileName = getFileNameFromURI(newAccountPhotoUri); if (!newAccountPhotoFileName.equals("")) { appAccountPhotoChanged = true; cropImage(newAccountPhotoUri); } } } //... } }
额外注意事项
- 对于Android 10及以上版本,如果你使用的是公共存储目录(比如
DIRECTORY_PICTURES),需要适配Scoped Storage规则。不过用FileProvider的方式通常可以正常工作,但如果还是有问题,可以考虑通过MediaStore来插入图片记录,获取Uri。 - 测试时尽量用不同品牌的设备,有些厂商的定制系统对相机Intent的行为可能略有差异,多设备测试能更快发现问题。
内容的提问来源于stack exchange,提问作者marcuthh
相关产品推荐
相关产品推荐

