我正在尝试使用此代码将音乐文件从我的应用发送到其他文件。我已经启用了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
答案 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>