我创建了一个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中的音频文件?
答案 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
资源中
Android WebView playing audio with javascript
使用HTML5:
这里有一些你没试过的方法。最近我一直在使用很多WebViews
和JavaScript
,所以也许其中一种方法可以解决这个问题。
此致
答案 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;
}