在Android中分享res / raw文件夹中的音频文件

时间:2016-03-12 15:47:32

标签: android audio share-intent

我正在尝试从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上分享它时,它会说"无法附加空文件"。看起来我没有得到正确的文件路径,所以我基本上什么都不分享。我究竟做错了什么?

非常感谢任何帮助。

3 个答案:

答案 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值。您的选择是:

  1. 删除该功能,或

  2. 将资源中的数据复制到文件中,然后使用FileProvider,可能与my LegacyCompatCursorWrapper一起使用,或

  3. 使用my StreamProvider,可直接投放raw资源,或

  4. 将资源中的数据复制到一个文件中,然后使用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。现在它工作正常!