【发布时间】:2016-04-20 04:33:33
【问题描述】:
我的 Android 应用在 WebView 中显示 html5 电子书。
我有一个包含所有资源的电子书的压缩文件:文本、图像和音频(mp3 文件)。
为了解压这本书,我使用了 shouldInterceptRequest(),它拦截 file:///... 请求,并通过 WebResourceResponse 对象返回数据。该代码适用于文本和图像。
当我访问音频资源时,出现运行时错误,并且无法播放音频文件。
注意:我确实看到返回的解压缩文件大小正确(大约 10MB)。
我收到的错误消息:
cr_MediaResourceGetter 文件不存在
cr_MediaResourceGetter 无法配置元数据提取器
我的音频 HTML 代码:
<div xmlns="http://www.w3.org/1999/xhtml">
<p style="text-align:center;margin:0px;">
<audio controls="controls" src="../Audio/01-AudioTrack-01.mp3">Your browser does not support the audio tag.</audio>
<br />
</p>
</div>
我的 Android 代码:
setWebViewClient(new WebViewClient()
{
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, final String url)
{
String urlWithoutAnchor = URLUtil.stripAnchor(url);
String fileName = urlWithoutAnchor;
try {
byte [] resource = tbxPool.getResource(fileName);
/* SIMPLE VERSION without calling setResponseHeaders():
return new WebResourceResponse(mimeType, "UTF-8", new ByteArrayInputStream(resource));
*/
WebResourceResponse returnedMediaResource = new WebResourceResponse(mimeType, "UTF-8", new ByteArrayInputStream(resource));
if (mimeType.toLowerCase().startsWith("audio")) {
Map<String, String> responseHeaders = new HashMap<String, String>();
responseHeaders.put("Content-Type", mimeType);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {//2CLEAN
returnedMediaResource.setResponseHeaders(responseHeaders);
Logger.v(TAG, "Response Headers added to audio resource");
}
else {
//TODO: Handle else for API<21. Toast?
}
}
return returnedMediaResource;
} catch (IOException e) {
Logger.e(TAG, "failed to load resource "+fileName,e);
return null;
}
}
}
环境
安卓 6.0.1 (Nexus 5)
Android 系统 WebView 版本 47
需求说明
音频将像 html5 文档一样在浏览器中播放,无需启动外部播放器。
问题:
我究竟做错了什么?!非常感谢!
【问题讨论】:
标签: android html audio android-webview android-mediaplayer