我正在尝试从我的res/raw文件夹中共享音频文件。到目前为止,我所做的是:
Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sound); //parse path to uri
Intent share = new Intent(Intent.ACTION_SEND); //share intent
share.setType("audio/*");
share.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(share, "Share sound to"));
例如,当我选择在 GMail 上共享它时,它会说"无法附加空文件"。看起来我没有获得正确的文件路径,所以我基本上什么都没有共享。我做错了什么?
任何帮助将不胜感激。
将音频文件从资源复制到外部存储,然后共享:
InputStream inputStream;
FileOutputStream fileOutputStream;
try {
inputStream = getResources().openRawResource(R.raw.sound);
fileOutputStream = new FileOutputStream(
new File(Environment.getExternalStorageDirectory(), "sound.mp3"));
byte[] buffer = new byte[1024];
int length;
while ((length = inputStream.read(buffer)) > 0) {
fileOutputStream.write(buffer, 0, length);
}
inputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
Intent intent = new Intent(Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM,
Uri.parse("file://" + Environment.getExternalStorageDirectory() + "/sound.mp3" ));
intent.setType("audio/*");
startActivity(Intent.createChooser(intent, "Share sound"));
将WRITE_EXTERNAL_STORAGE
权限添加到 AndroidManifest.xml 文件:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
我做错了什么?
很少有应用正确处理android.resource
Uri
值。您的选择是:
-
删除该功能,或
-
将数据从资源复制到文件中,然后使用
FileProvider
,可能与我的LegacyCompatCursorWrapper
结合使用,或者 -
使用我的
StreamProvider
,它可以直接提供raw
资源,或者 -
将数据从资源复制到文件中,然后使用
Uri.fromFile()
,但这看起来将停止与下一版本的 Android 一起使用,基于使用 N 开发人员预览版进行测试的初步结果
编辑:它导致了一个NullPointException。这就是我在做什么:
File dest = Environment.getExternalStorageDirectory();
InputStream in = getResources().openRawResource(R.raw.sound);
try
{
OutputStream out = new FileOutputStream(new File(dest, "sound.mp3"));
byte[] buf = new byte[1024];
int len;
while ( (len = in.read(buf, 0, buf.length)) != -1){
out.write(buf, 0, len);
}
in.close();
out.close();
}catch (Exception e) {}
final Uri uri = FileProvider.getUriForFile(Soundboard.this, "myapp.folagor.miquel.folagor", dest); //NullPointerException right here!!
final Intent intent = ShareCompat.IntentBuilder.from(Soundboard.this)
.setType("audio/*")
.setSubject(getString(R.string.share_subject))
.setStream(uri)
.setChooserTitle(R.string.share_title)
.createChooserIntent()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(intent);
代码很好。唯一的问题是,在清单的敷衍上,我用"WRITE_EXTERNAL_STORAGE"而不是"android.permissions.WRITE_EXTERNAL_STORAGE"。所以我没有权限在外部存储中写入,由于缺乏权限,这导致了FileNotFoundException。现在它工作正常!