java - 将音乐文件从一个应用程序发送到另一个应用程序

标签 java android android-intent

我正在尝试使用此代码将音乐文件从我的应用程序发送到其他应用程序。我已经启用了 WRITE_EXTERNAL_STORAGE 权限。但是每当我选择我想与之共享我的文件的应用程序时,它都不会出现,或者我会看到 Toast 提示无法识别格式。

                                    String filePath = songs.get(viewPosition).getPath();
                                    Uri uri = Uri.parse(filePath);
                                    Intent share = new Intent(Intent.ACTION_SEND);
                                    share.setType("audio/*");
                                    share.putExtra(Intent.EXTRA_STREAM, uri);
                                    mContext.startActivity(Intent.createChooser(share, "Share Sound File"));

我从 filePath 获取的路径例如是这样的:/storage/emulated/0/Music/2Pac - better dayz - tupac - better days.mp3

最佳答案

我的代码的问题是由于在 Android N 之后文件发送方式发生了变化。现在应用程序应该使用 content://而不是 file://以便平台可以扩展接收应用程序的临时权限。唯一缺少的是文件提供程序,它会将 file://更改为 uri 中的 content://。

我的问题的完整解决方案在这里:https://stackoverflow.com/a/38858040/8430049

所以代码应该是这样的:

                                    String filePath = songs.get(viewPosition).getPath();
                                    Uri uri = FileProvider.getUriForFile(mContext, "com.simplemusicplayer.fileprovider", new File(filePath));
                                    Intent share = new Intent(Intent.ACTION_SEND);
                                    share.setType("audio/*");
                                    share.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                                    share.putExtra(Intent.EXTRA_STREAM, uri);
                                    mContext.startActivity(Intent.createChooser(share, "Share Sound File"));

Android manifest 需要包含 provider:

<provider
        android:authorities="com.simplemusicplayer.fileprovider"
        android:name="android.support.v4.content.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

应用程序将授予访问权限的路径存储在 xml/provider_paths.xml 中

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

关于java - 将音乐文件从一个应用程序发送到另一个应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837927/

相关文章:

java - 如何改变java程序单个部分的外观

java - Apache Http 客户端 - 停止从 URL 中删除双斜杠

java - 在显示 Activity 之前预加载 Activity ?

android - 当我点击按钮(Intent)打开它时,谷歌地图在我的应用程序上崩溃

Android Intent 选择器 - 导航应用

java - Liberty 服务器忽略 WAR 文件中的 Logging.properties

java - 数据绑定(bind) - 找不到 BR 类

Android:有没有办法以编程方式获取已定义字符串数组的名称值?

android - 比较按钮的背景资源

java - 从 mainactivity 访问 searchview 查询文本