欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android编程使WebView支持HTML5 Video全屏播放的解决方法

程序员文章站 2023-11-28 21:36:22
本文实例讲述了android编程使webview支持html5 video全屏播放的解决方法。分享给大家供大家参考,具体如下: 1)需要在androidmanifest....

本文实例讲述了android编程使webview支持html5 video全屏播放的解决方法。分享给大家供大家参考,具体如下:

1)需要在androidmanifest.xml文件中声明需要使用hardwareaccelerate, 可以细化到activity级别,如果不需要的view可以声明不要用加速,但是需要在代码中做,具体如下:

a. 如果要声明整个应用都要加速:

复制代码 代码如下:
<application ... android:hardwareaccelerated ="true">

b. 如果要在activity中声明,则:
复制代码 代码如下:
<activity ... android:hardwareaccelerated="true" >
还可以更细化到window, getwindow.setflags(
         windowmanager.layoutparams.flag_hardware_accelerated,
windowmanager.layoutparams.flag_hardware_accelerated);

c. 如果application或者activity都申明了要硬件加速,但是为了某些原因(比如省电?),一些view不需要硬件加速的话,

复制代码 代码如下:
view.setlayertype(view.layer_type_software, null);

2)可以说挺奇怪的是,需要在androidmanifest.xml文件中用上<use-sdk></use-sdk>标签,而且如果是空的还不行,必须写上targetsdk或者minsdk,但是我试验过,不管写版本是多少都没有关系。。。理论上说,android应该是从3.0( api level 11)开始可以对2d渲染加速,但是我把targetsdk设置为5都可以使用的,但是这个标签不写还不行。

一般来说,上面的操作做了,就可以使用video标签播放视屏了,如果要支持全屏,还需要做一点操作:

1)给webview一个webchromeclient对象,这个webchromeclient对象需要实现onshowcustomview和onhidecustomview方法,下面是一个实现例子:

@override
public void onshowcustomview(view view, customviewcallback callback) {
   if (mycallback != null) {
      mycallback.oncustomviewhidden();
      mycallback = null ;
      return;
   }
   long id = thread.currentthread().getid();
   wrtlog. v("widgetchromeclient", "rong debug in showcustomview ex: " + id);
   viewgroup parent = (viewgroup) mwebview.getparent();
   string s = parent.getclass().getname();
   wrtlog. v("widgetchromeclient", "rong debug ex: " + s);
   parent.removeview( mwebview);
   parent.addview(view);
   myview = view;
   mycallback = callback;
   chromeclient = this ;
}
private view myview = null;
private customviewcallback mycallback = null;
public void onhidecustomview() {
   long id = thread.currentthread().getid();
   wrtlog. v("widgetchromeclient", "rong debug in hidecustom ex: " + id);
   if (myview != null) {
      if (mycallback != null) {
          mycallback.oncustomviewhidden();
          mycallback = null ;
      }
      viewgroup parent = (viewgroup) myview.getparent();
      parent.removeview( myview);
      parent.addview( mwebview);
      myview = null;
   }
}

好吧,这个写法和网上很多写法不一样,网上大部分的例子都是onshowcustomview方法接收到的view是一个videoview对象,而这里是一个找不到的html5videofullscreen的videosurfaceview子类,而且这个子类还是一个private的子类,在外面根本没有办法访问到,android.jar中也没有html5videofullscreen这个类。如果想要在application中访问到这个类,那么需要把<android-sdk-path>/platforms/<android-version>/data/layoutlib.jar这个包加到buildpath中,而且从android-14,也就是android4.0以后才这样,也就是说,网上说的那个方法在android3.0时代是可以用的,android4.0以后就不行了,我用的是android4.0.3。

其实不管是什么版本,这个段代码的大概意思就是,在onshowcustomview方法中,将获取到的view放到当前activity的最上方,在onhidecustomview中,将之前的view隐藏或者删除,将原来被覆盖的webview放回来,并结束播放,否在会报mediaplayer illegalstatusexception, 而且还是native method,根本没法调试了。

上面代码是片段,很多朋友看了也不能解决问题,完整实例代码代码点击此处本站下载

可以下载下来,用eclipse导入工程,把样例视频放到sdcard根部目录下,从系统角度看就是/mnt/sdcard即可。

效果如图:

全屏前:

Android编程使WebView支持HTML5 Video全屏播放的解决方法

全屏后:

Android编程使WebView支持HTML5 Video全屏播放的解决方法

希望本文所述对大家android程序设计有所帮助。