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

时间:2018-08-14 09:18:14

标签: 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-更好的dayz-tupac-更好的days.mp3

2 个答案:

答案 0 :(得分:2)

我的代码存在问题是由于Android N之后文件的发送方式发生了变化。现在,应用程序应使用content://而不是file://,以便平台可以扩展接收应用程序的临时权限。唯一缺少的是File Provider,它将在uri中将file://更改为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清单需要包含提供程序:

<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>

答案 1 :(得分:0)

根据@Flyentology的回答,我必须进行一些更改才能使其正常工作。

<paths>
  <external-path name="external_files" path="."/>
  <root-path name="root" path="." />
</paths>