android - 是否可以使用内容 ://as a source for an <audio> element in a WebView

标签 android webview

我创建了一个 ContentProvider。它导出我的 assets/目录中的文件。我正在使用 content://urls 访问 WebView 中导出的内容。

以下 HTML 按预期工作:

<img src="content://<provider-name>/test.jpg">

我正在尝试将内容提供程序用于 mp3 音频文件:

<div id='player'></div>
<script>
  url = "content://<provider-name>/test.mp3";
  var audio = document.createElement('audio');
  audio.src = url;
  audio.controls = "controls";
  document.getElementById("player").appendChild(audio);
</script>

我收到以下错误消息。

E/MediaPlayer(24120): Unable to to create media player
E/HTML5Audio(24120): couldn't load the resource: content://.../test.mp3 exc: java.io.IOException: setDataSource failed.: status=0x80000000

我尝试了 Android SDK 8 和 10,但没有成功。我在日志中没有看到对我的 ContentProvider 的任何访问。看起来在 WebView 中无法从音频标签访问内容。这看起来很奇怪,因为以下代码按预期工作:

MediaPlayer player = MediaPlayer.create(this, 
    Uri.parse("content://<provider-name>/test.mp3")
);
player.start();

如何在 WebView 中播放来自 ContentProvider 的音频文件?

最佳答案

简短的回答是否定的,您不能使用 content:// 作为音频元素的来源。

您得到的错误来自 HTML5Audio setDataSource 方法,如果您查看 source code , 使用音频 url 调用 MediaPlayer setDataSource。如果你看看 documentation对于 MediaPlayer 类,它仅支持文件路径和 http/rtsp url。

我认为最好的办法是将音频内容保存到文件路径并使用 file: url 访问它。

但是,如果我没记错的话,您还需要使文件世界可读,以便 MediaPlayer 代码访问它。这需要使用私有(private) android.os.FileUtils 类,代码如下:

void makeFileReadable(String filename) {
  try {
    Class fileUtils = Class.forName("android.os.FileUtils");
    Method setPermissions = fileUtils.getMethod("setPermissions", String.class,
     int.class, int.class, int.class);
    setPermissions.invoke(fileUtils, filename, 0775, -1, -1);
  }
  catch (Exception ex) {
  }
}

775 等同于 rwxrwxr-x,它可能比必要的更宽松,因此您可能想尝试使用更宽松的值进行试验。另请注意,您可能需要为包含该文件的目录以及该目录的父目录等设置权限 - 而不仅仅是文件本身。

关于android - 是否可以使用内容 ://as a source for an <audio> element in a WebView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8578433/

相关文章:

c# - Xamarin-文件 :///android_asset

webview - Xamarin Form WebView 高度作为 HTML 内容

android - 在基于Chromium的 float WebView中播放YouTube视频时出现音频滞后或断断续续的情况

android - 我应该使用什么来继续连接,我将在离散时间发送和获取数据?

java - 我应该在编辑 Java 文件的同时只修改 Android 的 XML 吗?

json - 移动浏览器上的 native JSON对象支持

Android Webview SwipeRefreshLayout

android - 如何在 Android 上使用带有 V8 的 Chrome 调试器

android - 远程 View 中的 achartengine 位图宽度

android - 如何在android studio中移动和重命名项目?