Android FileProvider报错Failed to find configured root解决方案
问题原因
该报错是FileProvider无法匹配传入文件路径对应的配置根目录,常见触发点有三个:
- 使用AndroidX版本的FileProvider时,meta-data配置仍然用了旧支持库的标识
- 调用
FileProvider.getUriForFile时传入的authorities参数,和Manifest中配置的authorities不一致 - 多构建变体/多渠道打包时,运行时包名和配置的
applicationId不一致
解决步骤
第一步:修正FileProvider的meta-data配置
把AndroidManifest中provider的meta-data节点的name属性修改为AndroidX对应的值:
<meta-data android:name="androidx.core.content.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" />
第二步:校验authorities一致性
确认调用FileProvider.getUriForFile时传入的第二个参数,和Manifest中配置的android:authorities完全一致。你当前配置的是${applicationId}.provider,如果项目有多构建变体,要注意applicationId可能会加后缀(比如.debug),用代码动态获取packageName + ".provider"即可,不要写死固定值。
第三步:优化file_paths.xml配置
你当前的配置已经包含了external-files-path指向.,理论上可以匹配/Android/data/[包名]/files/下的所有子目录,如果想要更精准匹配Download目录,可以修改为:
<?xml version="1.0" encoding="utf-8"?> <paths> <!-- 匹配getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS)对应的路径 --> <external-files-path name="Download" path="Download/" /> <!-- 其余原有路径配置按需保留即可 --> <external-path name="external_files" path="." /> <files-path name="files-path" path="." /> <cache-path name="cache_files" path="." /> </paths>
可选方案(对应参考方案,切换到内部私有存储)
如果你不需要将文件存到外置存储,可以修改存储路径到App内部私有目录,同步修改配置即可:
- 调整存储路径代码:
val destinationPath = File(context.filesDir, "Download") // 提前创建目录避免写入失败 if (!destinationPath.exists()) destinationPath.mkdirs()
- 在file_paths.xml新增对应路径配置:
<files-path name="internal_download" path="Download/" />
内容的提问来源于stack exchange,提问作者Hossein Kurd
相关产品推荐
相关产品推荐

