我创建了一个 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/