通过Intent分享raw目录下audio.mp3文件时遇错误求助
解决Raw目录音频文件分享失败的问题
你构造的Uri格式错误,而且raw目录下的资源属于App私有存储范畴,其他应用没有权限直接访问,这是导致分享失败的核心原因。以下是两种可行的解决办法:
方法一:使用FileProvider(符合Android权限规范,推荐)
1. 配置FileProvider路径
在res/xml目录下创建file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <raw-path name="raw_audio" path="." /> </paths>
2. 在AndroidManifest中注册FileProvider
在<application>标签内添加以下配置:
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider>
注意:如果使用AndroidX依赖,确保引入了androidx.core:core库
3. 修改分享代码
// 获取raw资源的Uri Uri uri = FileProvider.getUriForFile(context, context.getPackageName() + ".fileprovider", new File("android.resource://" + context.getPackageName() + "/" + R.raw.audio)); Intent share = new Intent(Intent.ACTION_SEND); share.setType("audio/mpeg"); // 使用更精确的MIME类型,比audio/*兼容性更好 share.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); share.putExtra(Intent.EXTRA_STREAM, uri); context.startActivity(Intent.createChooser(share, "Share Sound File"));
方法二:复制Raw资源到外部临时目录再分享
如果不想用FileProvider,可以把raw资源复制到外部存储的临时文件夹,再分享该文件:
// 复制raw资源到外部临时文件 File tempAudio = new File(context.getExternalCacheDir(), "audio_temp.mp3"); try (InputStream in = context.getResources().openRawResource(R.raw.audio); OutputStream out = new FileOutputStream(tempAudio)) { byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } } catch (IOException e) { e.printStackTrace(); return; } // 生成文件Uri并分享 Uri uri = Uri.fromFile(tempAudio); Intent share = new Intent(Intent.ACTION_SEND); share.setType("audio/mpeg"); share.putExtra(Intent.EXTRA_STREAM, uri); context.startActivity(Intent.createChooser(share, "Share Sound File"));
注意:Android 7.0及以上版本,Uri.fromFile()会触发FileUriExposedException,所以这种方法更适合低版本系统,高版本优先推荐FileProvider方案
内容的提问来源于stack exchange,提问作者AHTISHAM ABID
相关产品推荐
相关产品推荐

