Android FileProvider抛出IllegalArgumentException:未找到指定路径的配置根目录
你遇到的核心问题是:图片存储的目录不在FileProvider预先配置的根目录范围内,导致系统无法映射对应的Uri。咱们一步步来搞定这个问题:
1. 先搞懂你的存储路径位置
报错里的路径/data/data/com.example.diksha.chatapplication/app_photos/diksha.jpg,是通过Context.getDir("app_photos", MODE_PRIVATE)创建的自定义内部目录——它直接在app的内部存储根目录下,而FileProvider默认只覆盖files/、cache/这些标准子目录,所以找不到对应的配置根。
2. 两种解决方案(推荐第二种)
方案一:临时快速解决(不推荐,安全性低)
直接在provider_paths.xml里添加<root-path>,让FileProvider覆盖整个内部存储:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 注意:root-path会暴露整个内部存储,不建议在正式版使用 --> <root-path name="internal_root" path="." /> </paths>
方案二:规范存储路径(推荐)
把图片移到getFilesDir()下的子目录里(也就是/data/data/com.example.diksha.chatapplication/files/app_photos/),这样就能用FileProvider默认支持的<files-path>配置:
第一步:修改图片存储代码
把创建文件的代码改成:
// 获取files目录下的app_photos子目录,不存在就创建 File photosDir = new File(getFilesDir(), "app_photos"); if (!photosDir.exists()) { photosDir.mkdirs(); } // 创建图片文件 File imageFile = new File(photosDir, "diksha.jpg");
第二步:修正provider_paths.xml
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- path对应files目录下的app_photos子目录,name是Uri里的别名 --> <files-path name="my_photos" path="app_photos/" /> </paths>
3. 检查Manifest里的FileProvider配置
确保你的provider配置完全正确,特别是authorities要和代码里的一致:
<provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.diksha.chatapplication.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider>
4. 生成Uri和调用图库的代码要正确
生成Uri时必须用和Manifest里一致的authorities,同时要给Intent添加读权限:
// 生成Uri Uri imageUri = FileProvider.getUriForFile(this, "com.example.diksha.chatapplication.fileprovider", imageFile); // 调用图库的Intent Intent viewIntent = new Intent(Intent.ACTION_VIEW); viewIntent.setDataAndType(imageUri, "image/*"); // 必须添加这个flag,否则图库没有权限访问你的文件 viewIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); startActivity(viewIntent);
之前的解决方案没生效,大概率是因为你没匹配对存储路径和FileProvider的配置项——很多同类问题的配置是针对files/或外部存储的,而你的目录在内部存储根目录下,自然不匹配。
内容的提问来源于stack exchange,提问作者Diksha Manchanda

