是否可以使用content://作为WebView </audio>中<audio>元素的源

时间:2011-12-20 16:14:12

标签: 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中的音频文件?

4 个答案:

答案 0 :(得分:4)

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

您获得的错误来自HTML5Audio setDataSource方法,如果您查看source code,请使用音频网址调用MediaPlayer setDataSource。如果您查看MediaPlayer类的documentation,它只支持文件路径和http / rtsp网址。

我认为您最好的选择是将音频内容保存到文件路径并使用file:网址进行访问。

但是,如果我没记错的话,您还需要使文件可读,以便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,可能比必要更宽松,因此您可能想尝试使用较不宽松的值进行试验。另请注意,您可能需要在包含该文件的目录和该目录的父目录等上设置权限 - 而不仅仅是文件本身。

答案 1 :(得分: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?

使用WebView以编程方式将资源置于MediaPlayer资源中

Sound in Webview

Android WebView playing audio with javascript

使用HTML5:

Html Audio in Android Webview

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

此致

答案 2 :(得分:1)

选项#1:清单文件。

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

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

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

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

选项#3:阅读权限

也许,播放器实际上无法读取该文件。在这种情况下,使用FileDescriptor应该可以工作。我已经在setDataSource(FileDescriptor fd)报告了某个地方(对不起,我记不起来了)。尝试使用setDataSource(FileDescriptor fd, long offset, long length),因为它似乎可以解决问题。

答案 3 :(得分:0)

我在惊慌失措后成功地完成了这项工作。 出于某种原因,从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;
}