【问题标题】:Sharing the audio file located on an url with other apps in android与 android 中的其他应用共享位于 url 上的音频文件
【发布时间】:2015-04-26 10:51:34
【问题描述】:

我的 android 应用程序在 amazon s3 存储桶上有 mp3 文件。我有一个访问该音频剪辑的 URL。通过将 URL 传递给媒体播放器的数据源,我可以使用 MediaPlayer 播放音频剪辑。

我正在创建一个应用程序,它允许用户将我的应用程序中的音频剪辑共享到其他 IM 应用程序,例如 whatsapp。因此,我将在 Activity 上提供一个共享小部件,然后单击该小部件,然后应该打开 whatsapp 并且用户应该能够选择他想要共享音频剪辑的联系人。

为此,我需要将音频剪辑下载到本地存储系统,然后使用 ContentURI 与其他应用程序共享文件。但是我无法弄清楚最好的方法是什么。

根据 Android 文档,以下代码可用于发送二进制文件:

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

我假设音频文件是二进制文件。所以,我使用下面的代码来发送音频剪辑。

Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.putExtra(Intent.EXTRA_STREAM, uriToImage);
intent.setType("audio/mpeg3");
startActivity(intent);

看起来我在这里缺少的唯一部分是“uriToImage”。谁能帮助我了解如何获取位于 URL 的资源的“uriToImage”。 ?

根据 CommonsWare 的评论更新了代码。以下是更新后的代码:

Intent intent = new Intent(android.content.Intent.ACTION_SEND);
                Uri contentUri = Uri.fromFile(new File(clipAudioUrl));
                intent.putExtra(Intent.EXTRA_STREAM, contentUri);
                intent.setType("audio/mpeg");
                intent.setPackage("com.whatsapp");
                startActivity(intent);

触摸共享小部件后,Watsapp 正在直接打开(这是我想要的),但是共享却出现错误“共享失败”。我假设这是因为我使用了以下代码的 uri:

Uri contentUri = Uri.fromFile(new File(clipAudioUrl));

根据 CommonsWare 的评论,whatsapp 还希望 URI 的格式为“file:\”或“content:\”

您能否帮我将 URL 转换为“file:\”或“content:\”的格式。谢谢。

【问题讨论】:

  • “例如,当用户单击图像时,应将音频剪辑发布到 watsapp”——什么图像? WhatsApp 与这张图片有什么关系?
  • 我已经更新了这个问题。你能帮我吗?我需要一个真正快速的解决方案。

标签: java android android-intent mobile-application


【解决方案1】:

我将在 Activity 上提供一个共享小部件,然后单击该小部件,然后应该打开 whatsapp

仅当用户选择 WhatsApp 时。请不要假设您的应用程序的所有用户都安装了 WhatsApp,或者希望将 WhatsApp 用于您应用程序中的所有内容。

为此,我需要将音频剪辑下载到本地存储系统,然后使用 ContentURI 与其他应用共享文件。

从技术上讲,您可以将 S3 URL 与 ACTION_SEND 一起使用,但这意味着该 URL 是公开的。

否则,使用任何您想要的文件(AWS SDK、HttpUrlConnection、OkHttp 等)将文件下载到内部存储(例如,getCacheDir()),然后使用FileProvider 将其提供给其他应用程序。 FileProvider 可以给你UriACTION_SEND 一起使用。

【讨论】:

  • 是的,该 URL 是公开的。我没有太多时间去探索如何使用 FileProvider。是否可以共享文件而无需下载?
  • @SwarupDonepudi:只需使用 S3 条目的 URL。
  • 对于发送文本,我会使用 intent.putExtra(Intent.EXTRA_TEXT, "Textmessage");但是对于存储在 URL 位置的音频剪辑,我应该使用什么?我现在正在使用下面的代码。意图 i = new Intent(android.content.Intent.ACTION_SEND); i.putExtra("音频内容应该放在这里不是吗?"); i.setType("纯文本"); startActivity(i);
  • @SwarupDonepudi:首先,使用实际的 MIME 类型。纯文本是text/plain,而不是plain/text。其次,将 MIME 类型用于实际数据格式。关于 audio/mpegaudio/mp3 是否适合 MP3 文件似乎存在争议。您最终可能会使用*/*audio/*。第三,使用EXTRA_STREAM 而不是EXTRA_TEXT,根据您的URL 提供Uri。现在,可能有一些应用程序会在这里期待content://file:// Uri 方案,而不是http,因此这种方法可能不适用于所有应用程序。
【解决方案2】:

该解决方案几乎基于 CommonsWare 的建议。但是在我的情况下,我没有使用 FileProvder 发送文件。相反,我使用下面的代码使其工作。

public void onClick(View v) {
                    final Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
                    String audioClipFileName="shoutout.mp3";
                    shareIntent.setType("audio/mp3");
                    shareIntent.putExtra(android.content.Intent.EXTRA_STREAM, Uri.parse("file://"+"/sdcard/"+audioClipFileName));
                    shareIntent.setPackage("com.whatsapp");
                    startActivity(Intent.createChooser(shareIntent, "Share Audio Clip"));
                }

令我惊讶的是,我居然发现我的问题完全是 Intent.ACTION_SEND Whatsapp 的重复。

对我有用的解决方案来自上述问题的答案。

【讨论】:

  • 我试过这段代码,但附件文件每次都是空的。如何解决?
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-09
  • 2012-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多