使用FileProvider向Gmail分享图片时触发IllegalArgumentException错误
解决FileProvider分享图片时的根目录找不到问题
这个问题我之前处理过一模一样的情况,核心就是你的file_provider_paths.xml配置不完整(你贴的内容里<externa...明显没写完),导致FileProvider没法定位到/uploads/b056441c611b4e0a9a35.jpg所在的根目录。下面给你分步解决:
第一步:补全file_provider_paths.xml的正确配置
首先得明确你的uploads目录到底存在哪里,分两种常见情况:
情况1:uploads在外部公共存储根目录(比如SD卡根目录下的/uploads/)
把你的paths文件改成这样:
<?xml version="1.0" encoding="utf-8"?> <paths> <!-- name是自定义的别名,path指定到uploads子目录 --> <external-path name="external_uploads" path="uploads/" /> </paths>
情况2:uploads在应用私有外部存储(比如/Android/data/staging.mytours.co/files/uploads/)
这种更推荐,因为是应用私有目录,不需要额外权限,配置改成:
<?xml version="1.0" encoding="utf-8"?> <paths> <external-files-path name="app_private_uploads" path="uploads/" /> </paths>
第二步:确保代码里的文件路径和配置匹配
比如如果是情况1,获取图片文件的代码应该是:
// 获取外部公共存储根目录 File uploadRoot = Environment.getExternalStorageDirectory(); // 定位到uploads目录下的目标图片 File targetImage = new File(uploadRoot, "uploads/b056441c611b4e0a9a35.jpg");
如果是情况2,用应用私有外部存储:
// 获取应用私有外部存储的files目录 File uploadRoot = getExternalFilesDir(null); File targetImage = new File(uploadRoot, "uploads/b056441c611b4e0a9a35.jpg");
第三步:生成Uri时注意Authority一致
生成FileProvider的Uri时,要和你AndroidManifest里的android:authorities完全匹配:
Uri imageUri = FileProvider.getUriForFile( getApplicationContext(), "staging.mytours.co", // 必须和Manifest里的authorities一致 targetImage );
额外注意事项
- 如果是Android 10及以上版本使用外部公共存储,需要在
AndroidManifest.xml的<application>标签里添加android:requestLegacyExternalStorage="true"来兼容旧的存储方式,或者改用Scoped Storage的API。 - 确认你的uploads目录确实存在,并且图片文件没有被删除或损坏。
内容的提问来源于stack exchange,提问作者Himanshu
相关产品推荐
相关产品推荐

