使用FileProvider获取音频Uri并分享时出现问题求助
排查Android中FileProvider分享音频Uri的问题
嘿,我来帮你捋捋这段代码里可能踩的坑,咱们一步步来:
1. 先清理冗余的混淆代码
你代码里有一行没用到的调用:
getUriForFile(getContext(), "haydo.kufurbaz.kfrbazhaydosesleri", f);
这里的authorities和后面正确调用的haydo.kufurbaz.kfrbazhaydosesleri.fileprovider对不上,虽然这行没实际作用,但很容易让你搞混正确的配置,建议直接删掉它。
2. 重中之重:Manifest里的FileProvider必须配置正确
这是绝大多数FileProvider问题的根源,你得确保AndroidManifest.xml里的FileProvider注册信息和代码完全匹配:
<application> ... <provider android:name="androidx.core.content.FileProvider" android:authorities="haydo.kufurbaz.kfrbazhaydosesleri.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ... </application>
划重点:
android:authorities必须和你代码里getUriForFile的第二个参数完全一致,多一个少一个字符都不行android:exported必须设为false,这是FileProvider的硬性要求,不能导出android:grantUriPermissions必须开成true,这样才能给其他应用临时访问Uri的权限
3. 别忘了创建file_paths.xml配置文件
你得在res/xml/目录下新建file_paths.xml,告诉FileProvider你允许共享哪些目录。因为你的音频在外部存储根目录,配置可以这么写:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="." /> </paths>
这里path="."表示允许共享外部存储根目录下的所有文件,要是你只需要共享特定文件夹(比如Music),改成path="Music/"就行。
4. 必须给Uri加临时访问权限
光用FileProvider还不够,得确保接收分享的应用能拿到访问这个Uri的权限。有两种方式:
- 简单版:给Intent加flags
myınIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
- 稳妥版(适配createChooser的情况):给所有可能的接收方都授权
List<ResolveInfo> resInfoList = getContext().getPackageManager().queryIntentActivities(myınIntent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo resolveInfo : resInfoList) { String packageName = resolveInfo.activityInfo.packageName; getContext().grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION); }
这步漏了的话,其他应用打开音频时会提示权限不足。
5. 先确认文件真的存在
在创建File对象后,最好加个判断,避免因为文件不存在白忙活:
File f = new File(path); if (!f.exists()) { Toast.makeText(getContext(), "音频文件找不到哦", Toast.LENGTH_SHORT).show(); return; }
6. 适配Android 10+的存储规则
如果你的应用目标SDK是29及以上,直接用Environment.getExternalStorageDirectory()会触发分区存储限制,建议改用应用专属的外部存储目录:
// 替换原来的path,存在应用专属的Music目录里 String path = new File(getContext().getExternalFilesDir(Environment.DIRECTORY_MUSIC), "aaaw.mp3").getAbsolutePath();
要是你非得用根目录的文件,得在Manifest里加这个临时兼容配置:
<application android:requestLegacyExternalStorage="true">
不过这只是权宜之计,长期来看还是建议适配分区存储规范。
把这些点挨个检查一遍,应该就能解决你的分享问题啦。
内容的提问来源于stack exchange,提问作者levi
相关产品推荐
相关产品推荐

