You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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即可。

修改建议:

  1. 把保存照片的Uri设为类的成员变量:
    private Uri mSavedImageUri;
    
  2. 在启动相机前保存这个Uri:
    mSavedImageUri = uriSavedImage;
    startActivityForResult(cameraIntent, REQUEST_CAMERA);
    
  3. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:25:05