2

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

任何帮助将非常感激。

4

3 回答 3

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"/>
于 2016-03-12T21:59:29.737 回答
1

我究竟做错了什么?

很少有应用程序android.resource Uri正确处理值。您的选择是:

  1. 删除该功能,或

  2. 将资源中的数据复制到文件中,然后使用FileProvider,也许与myLegacyCompatCursorWrapper结合使用,或者

  3. 使用myStreamProvider,它可以raw直接提供资源,或者

  4. 将资源中的数据复制到一个文件中,然后使用Uri.fromFile(),但是根据使用 N Developer Preview 测试的初步结果,这看起来它将停止使用下一版本的 Android

于 2016-03-12T15:56:56.037 回答
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 的许可上,我有“WRITE_EXTERNAL_STORAGE”而不是“android.permissions.WRITE_EXTERNAL_STORAGE”。所以我没有权限在外部存储中写入,由于缺乏权限而导致 FileNotFoundException。现在它工作正常!

于 2016-03-12T17:41:50.563 回答