FileProvider报错Failed to find configured root that contains如何解决?
问题根因
你的文件存储路径为/data/data/{packageName}/images,当前provider_paths配置的路径标签没有覆盖该目录,因此FileProvider无法匹配到合法根目录触发报错。
FileProvider内置路径标签对应规则
你当前配置的标签对应的实际存储路径如下:
<files-path>:对应应用内置私有存储的/data/data/{packageName}/files/目录<cache-path>:对应应用内置私有存储的/data/data/{packageName}/cache/目录<external-path>:对应外置存储根目录/storage/emulated/0/<external-files-path>:对应外置存储应用私有目录/storage/emulated/0/Android/data/{packageName}/files/<external-cache-path>:对应外置存储应用缓存目录/storage/emulated/0/Android/data/{packageName}/cache/
你存放图片的images目录直接创建在/data/data/{packageName}/根目录下,和files、cache目录平级,不在上述任何标签的覆盖范围内,因此匹配失败。
解决方案
推荐使用方案1,符合Android官方存储规范:
方案1:调整存储路径(推荐)
将图片存储路径修改为/data/data/{packageName}/files/images/,适配你已配置的<files-path>规则,无需修改provider_paths文件。
修改后生成文件路径的代码参考:
// 直接用context.getFilesDir()获取files目录的根路径,不需要手动拼接包名 File imagesDir = new File(getContext().getFilesDir(), "images"); if (!imagesDir.exists()) { imagesDir.mkdirs(); } File imagePath = new File(imagesDir, "你的图片文件名");
方案2:新增路径适配规则(不推荐,仅兼容现有逻辑)
如果必须保留当前的/data/data/{packageName}/images存储路径,可在provider_paths的<paths>标签内新增<root-path>规则,匹配应用私有根目录:
<root-path name="app_private_root" path="data/data/{替换为你的实际包名}/images/" />
注意:<root-path>会匹配设备根目录,规则范围过大,存在一定安全风险,非必要不建议使用。
额外校验项
确认以下配置无误,避免其他因素导致报错:
- Manifest中
provider的android:authorities值,和代码中FileProvider.getUriForFile传入的第二个参数完全一致 - 代码中传入的
imagePath是合法的本地文件路径,没有拼接错误
内容的提问来源于stack exchange,提问作者user2638180
相关产品推荐
相关产品推荐

