在WhatsApp上分享歌曲,总是以“发送失败”消息结束

时间:2017-11-05 01:02:45

标签: android

我从web服务获取输入流并将其转换为字节数组,因此我可以创建一个临时文件并使用MediaPlayer播放它(它是一个.mp3)。问题是我想在whatsapp上分享这首歌,但每当我尝试时,我都会收到“发送失败”的消息。

这就是我得到和播放这首歌的方式:

if (response.body() != null) {
   byte[] bytes = new byte[0];
   try {
      bytes = toByteArray(response.body().byteStream());
   } catch (IOException e) {
      e.printStackTrace();
   }

mediaPlayer.reset();
try {
     File tempMp3 = File.createTempFile("tempfile", "mp3", getContext().getCacheDir());
     tempMp3.deleteOnExit();
     FileOutputStream fos = new FileOutputStream(tempMp3);
     fos.write(mp3);
     fos.close();

     FileInputStream fis = new FileInputStream(tempMp3);

     mediaPlayer.setDataSource(fis.getFD());
     mediaPlayer.prepare();
}
catch (IOException ex) {
     String s = ex.toString();
     ex.printStackTrace();
}

mediaPlayer.start();

这个和几个类似的方式是我试图分享它:

String sharePath = Environment.getExternalStorageDirectory().getPath()
                    + "/tempfile.mp3";
            Uri uri = Uri.parse(sharePath);
            Intent share = new Intent(Intent.ACTION_SEND);
            share.setType("audio/*");
            share.putExtra(Intent.EXTRA_STREAM, uri);
            startActivity(Intent.createChooser(share, "Share Sound File"));

这首歌很好玩,我已经包含了在外部存储中读取和写入的许可,但我需要帮助来分享这首歌,无论是字节,文件还是其他任何作品,请。

1 个答案:

答案 0 :(得分:0)

您需要从

更改
File tempMp3 = File.createTempFile("tempfile", "mp3", getContext().getCacheDir());

File tempMp3 = new File(Environment.getExternalStorageDirectory() + "/"+ getString(R.string.temp_file) + getString(R.string.dot_mp3)); //<- this is "tempfile" and ".mp3"

然后你可以像这样分享

String sharePath = tempMp3.getAbsolutePath();
        Uri uri = Uri.parse(sharePath);
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("audio/*");
        share.putExtra(Intent.EXTRA_STREAM, uri);
        startActivity(Intent.createChooser(share, getString(R.string.share_song_file)));

主要问题是,您存储文件的位置无法与其他应用程序共享,只能从您自己的应用程序访问,因为getCacheDir()方法用于创建缓存文件,而不是持久地将数据存储在文件中,以及应用程序是私有的(并且createTempFile()在文件名的末尾生成随机数,因此您无法像这样硬编码正确的路径。) 此外,此解决方案还使用您包含的权限(访问外部存储)。