zoukankan      html  css  js  c++  java
  • Android 使WebView支持HTML5 Video(全屏)播放的方法

     

    转载自:http://blog.csdn.net/zrzlj/article/details/8050633

       1)需要在AndroidManifest.xml文件中声明需要使用HardwareAccelerate, 可以细化到Activity级别,如果不需要的View可以声明不要用加速,但是需要在代码中做,具体如下:
          a. 如果要声明整个应用都要加速:
             >
               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_SOFTWAREnull);
         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,根本没法调试了。

           上面代码是片段,很多朋友看了也不能解决问题,我上传了个样例工程在 http://download.csdn.net/detail/zrzlj/6348511 
           可以下载下来,用eclipse导入工程,把样例视频放到sdcard根部目录下,从系统角度看就是/mnt/sdcard即可。
           效果如图:
      全屏前:
       

      全屏后: 
       
  • 相关阅读:
    python 如何把在字符串里面的名字变成变量,进行复制
    2017-05-30 英语
    RYU 中如钩构建TCP数据包,设置ACK等标志
    Arch linux LXR 安装过程
    ubuntu如何配置lxr
    2017-05-27 英语
    Emacs学习笔记:移动
    9.特殊矩阵的压缩存储
    13.链路层设备
    9.CSMA_CD协议
  • 原文地址:https://www.cnblogs.com/jackwuyongxing/p/4028869.html
Copyright © 2011-2022 走看看