Android FileProvider.getUriForFile报错:找不到配置的根目录
下面是针对该问题的排查和解决建议:
修复file_provider_paths.xml的语法错误
你的配置文件第一行存在多余逗号,这会导致XML解析失败,进而让FileProvider无法加载路径配置:<!-- 错误写法 --> <paths>, <!-- 正确写法 --> <paths>去掉逗号后,
<cache-path>才能正确映射到应用内部缓存目录/data/data/com.sample.myapp/cache/——这很可能是核心问题,其他正常应用的配置没有该语法错误,因此可以正常运行。验证传入的cacheDir路径
确认调用getTmpFileUri时传入的cacheDir确实是应用的内部缓存目录(即context.cacheDir)。可以临时添加日志打印路径:Log.d("CacheDir", "Path: ${cacheDir.absolutePath}")如果打印的路径不是
/data/data/com.sample.myapp/cache/,说明传入的目录与<cache-path>配置不匹配,需要调整传入参数。统一FileProvider的meta-data名称
你使用的是androidx.core.content.FileProvider,建议将meta-data的name改为AndroidX对应的常量,避免兼容性问题:<meta-data android:name="androidx.core.content.FileProvider.FILE_PROVIDER_PATHS" android:resource="@xml/file_provider_paths" />检查Manifest合并后的FileProvider配置
复杂应用可能存在依赖库注册FileProvider的情况,导致合并后的Manifest出现冲突。可以通过Android Studio的Tools > App Links Assistant > Open Merged Manifest查看最终Manifest,确认:- 只有一个
${applicationId}.fileprovider的FileProvider条目 - 该条目的
meta-data正确指向你的file_provider_paths.xml
- 只有一个
清理并重建项目
有时候Gradle缓存或编译产物会导致配置不生效,执行以下操作:- 点击Android Studio的
Build > Clean Project - 然后点击
Build > Rebuild Project - 必要时执行终端命令清理Gradle缓存:
./gradlew cleanBuildCache
- 点击Android Studio的
内容的提问来源于stack exchange,提问作者jilbot

