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

Android 13设备(VIVO T1 5G)OnActivityResult读取拍摄图片失败

问题排查与解决方案

核心原因

VIVO T1 5G(Android 13)设备对external-path的映射处理存在厂商定制差异:系统期望路径根目录为/storage/emulated/0,但原配置的external-path在该设备上的实际映射路径与相机写入的路径不匹配,导致Uri解析时抛出路径不在预期根目录下的异常。

具体修复步骤

1. 替换File Provider路径配置为external-files-path

原external-path指向外部存储根目录,而你实际使用的是应用私有外部文件目录,应直接使用更精准的external-files-path映射,避免路径歧义:
在res/xml/file_paths.xml中修改配置:

<!-- 移除原可能存在的external-path配置 -->
<!-- <external-path name="external_files" path="." /> -->

<!-- 添加以下配置 -->
<external-files-path name="external_files" path="." />

external-files-path直接对应Context.getExternalFilesDir(null)的路径(即/storage/emulated/0/Android/data/你的包名/files/),与你存储图片的目录完全匹配,可规避VIVO设备的路径解析偏差。

2. 调整Uri生成逻辑,绑定正确的存储目录

生成图片文件时,明确使用应用私有外部文件目录,确保Uri生成严格匹配File Provider配置:

// 获取应用私有外部文件目录
File storageDir = getExternalFilesDir(null);
// 创建目标图片文件
File imageFile = new File(storageDir, "test_CAM_" + System.currentTimeMillis() + ".jpg");
// 通过File Provider生成合法Uri
Uri imageUri = FileProvider.getUriForFile(this, "你的包名.fileprovider", imageFile);

3. 完善相机启动的权限标记

Android 13中调用ACTION_IMAGE_CAPTURE无需申请读写权限,但需明确授予相机应用读写目标Uri的权限:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
// 添加权限标记,允许相机读写该Uri
takePictureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
takePictureIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}

4. OnActivityResult中通过ContentResolver读取图片

避免直接通过路径读取,改用ContentResolver操作Uri,彻底规避路径解析问题:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        try {
            InputStream inputStream = getContentResolver().openInputStream(imageUri);
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            // 后续图片处理逻辑
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

额外验证项

  • 打印getExternalFilesDir(null)的实际路径,确认在VIVO设备上是否为/storage/emulated/0/Android/data/你的包名/files/
  • 检查File Provider的authority是否与代码中getUriForFile的参数完全一致,避免拼写错误

内容的提问来源于stack exchange,提问作者komal Mane

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 00:25:05