嗯,我已经搜索了几天,如何显示全屏模式的 HTML5视频在安卓 WebView。
我设法在我的网络视图上播放 HTML5视频。在全屏模式下显示视频时出现了问题。
据我所知,android 有两种处理 < video > 标签的方式:
在 android 版本 < = 2.3.3 上,onShowCustomView 方法被触发,我可以拥有 VideoView 实例,并在视频完成时设置监听器,设置控制器等。目前为止还不错。
在 ICS (可能是3.0及以上版本) 上,< video > 看起来是以不同的方式处理的。当播放 HTML5视频时,onShowCustomView 并没有在正常模式下被调用——看起来 WebView 内部有一个内部业务在播放视频,所有在 < video > 标签中定义的控件都显示出来了——我无法以任何方式访问它。实际上,如果视频是在正常模式下播放,这是可以的,因为控制器在那里并且正在工作。
这就引出了一个大问题: 当以全屏模式显示视频时,会调用 onShowCustomView ——但是在 ICS 上,“ view”参数不是 VideoView 的实例。
我发现这个实例是 VideoSurfaceView,一个 HTML5VideoFullScreen 类的私有内部类。我们能够访问这个内部类的唯一方法是通过反射。
在查看了这个类的 GrepCode 之后,我了解到,与 VideoView 不同,HTML5VideoFullScreen $VideoSurfaceView 没有一个 MediaPlayer 实例,我可以听到它的事件或访问它的控件。我唯一能做的就是把这个 VideoSurfaceView 原封不动地放在一个全屏布局里,而不用控制它。
底线-当全屏显示视频时,我不知道视频什么时候结束,它的控制没有显示-这是相当悲哀的。我拿不到关闭全屏幕的触发器。
我尝试了一些不成功的变通方法:
反射: 我试图从内部类 VideoSurfaceView 访问持有 MediaPlayer 成员的 HTML5VideoFullScreen 实例。我没有设法得到它,我不确定这是可能的(ViewSurfaceView 不持有其所有者的实例)。
通过 Javascript 注册视频事件(例如 onend) ,然后通过 JavascriptInterface 在 JAVA 中处理我需要的内容: 我发现这个解决方案不可靠,因为在这样做的时候我遇到了另一个问题: < video > 标签可以嵌套在。Iframe 源代码不是我的,我不能得到它的内容(getElementById 或 getElementsByTagName [ i ]是空值)-这意味着,我不能到达 iframe 中的 < video > 元素。
我仍在寻找解决方案,关于这个问题的文章很少。有人破解了吗?非常感谢您的帮助!
VideoView class: 给你(has MediaPlayer)
HTML5VideoFullScreen $VideoSurfaceView class: 给你(没有 MediaPlayer)