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



我正在尝试从我的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值。您的选择是:

  1. 删除该功能,或

  2. 将数据从资源复制到文件中,然后使用 FileProvider ,可能与我的LegacyCompatCursorWrapper结合使用,或者

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

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

最新更新