如何为应用数据文件夹内的图片配置FileProvider并解决调用异常问题
问题根因
你当前的filepath配置使用的<files-path>标签匹配的是应用内部存储私有files目录(路径为/data/data/<你的包名>/files/),但你存储图片的路径是外部存储的应用专属files目录(对应/storage/emulated/0/Android/data/<你的包名>/files/),两者路径不匹配,FileProvider找不到对应路径规则就会抛出IllegalArgumentException。
解决步骤
- 第一步:修改xml路径配置文件(即你
@xml/filepath对应的文件),把<files-path>替换为<external-files-path>,该标签专门匹配Context.getExternalFilesDir(null)返回的路径,也就是你当前存图片的目录,修改后完整配置如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="my_images" path="/" /> </paths>
- 第二步:确认
pictureFile的构造逻辑正确,不要硬写存储路径,建议用官方推荐的方式构造文件对象,示例代码如下:
// 获取外部应用专属图片存储目录 File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); // 构造目标图片文件对象 File pictureFile = new File(storageDir, "IMG_25052021_171806.jpg");
- 第三步:确认调用
FileProvider.getUriForFile时传入的authorities参数,和Manifest中配置的android:authorities值完全一致,你当前配置的是com.abc.xyz.fileprovider,注意不要写错大小写或字符。
可选补充配置
如果你同时有存储到内部私有目录、外部公共目录等多种需求,可以在paths配置中同时添加多组规则,示例如下:
<paths xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 匹配内部存储files目录 --> <files-path name="internal_images" path="/" /> <!-- 匹配外部存储应用专属files目录 --> <external-files-path name="external_images" path="/" /> <!-- 匹配外部存储公共目录 --> <external-path name="public_images" path="Pictures/" /> </paths>
内容的提问来源于stack exchange,提问作者Rajeev Kumar
相关产品推荐
相关产品推荐

