You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

获取Android外部存储路径时触发java.lang.IllegalArgumentException求助

解决Android FileProvider找不到配置根目录的异常

你遇到的java.lang.IllegalArgumentException: Failed to find configured root that contains...异常,核心原因是FileProvider的目录配置和实际文件存储路径不匹配,再加上打开相机的Intent逻辑有误,我给你一步步拆解解决:

一、修正FileProvider的路径配置

你的paths.xml里用了<files-path>标签,这个标签对应的是App内部存储files目录(路径类似/data/data/你的包名/files/),但你实际要保存图片的目录是外部公共存储DCIM/eEmployee/(路径/storage/emulated/0/DCIM/eEmployee/),两者完全不对应,所以FileProvider找不到匹配的根目录。

paths.xml修改为以下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- external-path 对应外部存储根目录 /storage/emulated/0/ -->
    <external-path name="my_images" path="DCIM/eEmployee/"/>
</paths>
  • name是Uri中的占位符,可自定义;
  • path是外部存储根目录下的子路径,正好对应你保存图片的DCIM/eEmployee/文件夹,这样FileProvider就能识别目标文件的路径了。

二、修正打开相机的Intent逻辑

你当前用Intent.ACTION_VIEW是用来查看文件的,根本不是打开相机拍照的正确Action!正确做法是使用MediaStore.ACTION_IMAGE_CAPTURE,并通过EXTRA_OUTPUT告诉相机要把照片保存到你指定的路径。修改Java代码如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    String fileName = EmpConstants.startImgName + new SimpleDateFormat(EmpConstants.PhotoFileFormat, Locale.US).format(new Date());
    // 用File构造方法拼接路径,比字符串拼接更安全,避免分隔符错误
    File outFile = new File(mContext.getEmpImageDirPath(), fileName + ".jpg");
    // 确保authorities和清单文件中配置的完全一致
    Uri photoUri = FileProvider.getUriForFile(mContext, "com.efftronics.android.eEmployee.provider", outFile);
    
    Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // 告诉相机将拍摄的图片保存到指定Uri
    cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
    // 给相机授予读写Uri的权限
    cameraIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
    cameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    
    startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
}

三、补充权限配置(可选但必要)

如果你的App目标SDK是29(Android 10)及以下,确保清单文件中添加了外部存储权限,并在运行时申请:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

若目标SDK是29及以上,需在<application>标签中添加兼容配置,避免权限限制:

android:requestLegacyExternalStorage="true"

做完以上修改后,重新运行App,应该就能正常打开相机并将照片保存到指定的DCIM子目录了。

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

火山引擎 最新活动