【问题标题】:Is it possible to use content:// as a source for an <audio> element in a WebView是否可以使用 content:// 作为 WebView 中 <audio> 元素的来源
【发布时间】:2011-12-20 16:14:11
【问题描述】:

我创建了一个 ContentProvider。它在我的 assets/ 目录中导出文件。我正在使用 content:// url 来访问 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 的音频文件?

【问题讨论】:

  • 漫步其他答案,我认为这不会有帮助,但是尝试将 uses-permission android:name="android.permission.INTERNET" /&gt; 添加到您的清单中呢?只是一个共同的答案。我会看更多。
  • 也许这可能会有所帮助。 helpmeco.de/2012/2/…
  • @SmartLemon:不,这就是我迄今为止所做的。同样,作为dividuum,图像加载正常,JS运行良好:只是音频资源加载失败。

标签: android webview


【解决方案1】:

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

您遇到的错误来自HTML5Audio setDataSource 方法,如果您查看source code,则会使用音频网址调用MediaPlayer setDataSource。如果你查看documentationMediaPlayer 类,它只支持文件路径和http/rtsp url。

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

但是,如果我没记错的话,您还需要使文件世界可读,以便MediaPlayer 代码可以访问它。这需要使用私有 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,它可能比必要的更宽松,因此您可能想尝试使用更少的许可值。另请注意,您可能需要对包含该文件的目录以及该目录的父目录等设置权限,而不仅仅是文件本身。

【讨论】:

    【解决方案2】:

    以下是我认为有帮助的一些事情:

    澄清一下,文件路径

    Is there a path similar to file:///android_asset/ that points to the apps directory?

    content:// - 用于sdcard/上已导出的媒体

    file:///android_asset - 用于您的 assets/ 文件夹中的项目

    获取资产:

    使用AssetManager拉取资产:

    How to get URI from an asset File?

    使用 MediaPlayer 以编程方式从资产中将声音放入 WebView

    Sound in Webview

    Android WebView playing audio with javascript

    使用 HTML5:

    Html Audio in Android Webview

    这里有一些你没有尝试过的方法。最近我一直在使用很多WebViewsJavaScript,所以也许这些其他方法中的一种可以解决问题。

    问候,

    【讨论】:

    • 感谢您的回答。 content:// 如问题中所述,适用于图像,而不适用于媒体。我需要尝试 URL 拦截并启动我自己的 MediaPlayer(虽然听起来很痛苦:如何控制搜索并以这种方式进行良好的内存管理?)。
    • 我不确定,但我发现其他人使用 MediaPlayer 来实现这一点。
    【解决方案3】:

    选项#1:清单文件。

    检查您在清单文件中是否拥有正确的权限:

    <uses-permission android:name="android.permission.INTERNET" />
    

    选项 #2: 错误或损坏的音频文件。

    检查您是否可以使用 Android 的媒体播放器播放文件。

    选项#3:读取权限

    也许,播放器实际上无法读取该文件。在这种情况下,使用 FileDescriptor 应该可以工作。我在某处(抱歉,我不记得在哪里)读到setDataSource(FileDescriptor fd) 报告了一些具有相同异常的问题。尝试使用setDataSource(FileDescriptor fd, long offset, long length),似乎可以解决问题。

    【讨论】:

      【解决方案4】:

      在惊慌失措之后,我设法让这个工作正常进行。 出于某种原因,从 webView(使用 MediaPlayer)对 mp3 文件的内容提供程序调用不会调用 openAssetFile,而是调用 openFile。 (不确定提供商是否处理此路由)。这个问题似乎已在 4.2+ 中修复

      对我有用的旧版本的解决方案是在您的内容提供者中覆盖 openFile:

      @Override
      public AssetFileDescriptor openAssetFile(Uri uri, String mode){
          //your asset reading code that works for other file types goes here.
      }
      @Override
      public ParcelFileDescriptor openFile(Uri uri, String mode){
          try {
              AssetFileDescriptor afd = openAssetFile(uri, mode);
              return afd.getParcelFileDescriptor();
          } catch (FileNotFoundException e) {
              e.printStackTrace();
          }
          return null;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-13
        • 2013-10-12
        相关资源
        最近更新 更多