我正在尝试从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上分享它时,它会说"无法附加空文件"。看起来我没有得到正确的文件路径,所以我基本上什么都不分享。我究竟做错了什么?
非常感谢任何帮助。
答案 0 :(得分:4)
将音频文件从资源复制到外部存储,然后共享:
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"));
向 AndroidManifest.xml 文件添加WRITE_EXTERNAL_STORAGE
权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
答案 1 :(得分:1)
我做错了什么?
很少有应用正确处理android.resource
Uri
值。您的选择是:
删除该功能,或
将资源中的数据复制到文件中,然后使用FileProvider
,可能与my LegacyCompatCursorWrapper
一起使用,或
使用my StreamProvider
,可直接投放raw
资源,或
将资源中的数据复制到一个文件中,然后使用Uri.fromFile()
,但这似乎将停止使用下一版本的Android,基于使用N Developer Preview测试的初步结果
答案 2 :(得分:0)
编辑:它导致了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);
代码很好。唯一的问题是,在Manifest的permisions上,我有&#34; WRITE_EXTERNAL_STORAGE&#34;而不是&#34; android.permissions.WRITE_EXTERNAL_STORAGE&#34;。因此,我没有在外部存储中写入权限,这导致由于缺乏权限而导致FileNotFoundException。现在它工作正常!