这里我介绍了我的一个朋友如何解决在 Nexus One 中以 HTML 格式显示视频的问题:
我一直无法让视频内联播放。实际上,互联网上的许多人都明确提到,自 Honeycomb 以来就支持 HTML 中的内联视频播放,我们正在与 Froyo 和 Gingerbread 进行斗争......同样对于较小的手机,我认为全屏播放非常自然 - 否则看不到那么多.所以目标是让视频全屏打开。但是,此线程中建议的解决方案对我们不起作用 - 单击元素不会触发任何事情。此外,显示了视频控件,但没有显示海报,因此用户体验更加怪异。所以他做了以下事情:
将本机代码公开到 HTML 以通过 javascript 调用:
JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");
代码本身,有一个调用原生活动来播放视频的函数:
public class JavaScriptInterface {
private Activity activity;
public JavaScriptInterface(Activity activiy) {
this.activity = activiy;
}
public void startVideo(String videoAddress){
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); // The Mime type can actually be determined from the file
activity.startActivity(intent);
}
}
然后在 HTML 本身中,他不断失败,使视频标签能够播放视频。因此,最后他决定覆盖视频的onclick 事件,让它进行实际播放。这几乎对他有用——除了没有展示海报。最奇怪的部分来了——每次他设置标签的poster 属性时,他都会收到ERROR/AndroidRuntime(7391): java.lang.RuntimeException: Null or empty value for header "Host"。最后他发现了这个问题,这很奇怪——原来他在video标签中保留了source子标签,但从未使用过。奇怪的是,这正是导致问题的原因。现在看看他对video 部分的定义:
<video width="320" height="240" controls="controls" poster='poster.gif' onclick="playVideo('file:///sdcard/test.3gp');" >
Your browser does not support the video tag.
</video>
当然还需要在页面头部添加javascript函数的定义:
<script>
function playVideo(video){
window.JSInterface.startVideo(video);
}
</script>
我意识到这不是纯粹的 HTML 解决方案,而是我们能够为 Nexus One 类型的手机做的最好的解决方案。
该解决方案的所有功劳归于 Dimitar Zlatkov Dimitrov。