Android6.0 WebView播放视频源码分析

来源:互联网 发布:女生黄金比例身材算法 编辑:程序博客网 时间:2024/06/03 19:11

        最近因为项目的需要研究一下WebView播放视频的调用过程。同时也对研究问题的方法有了新的认识,研究问题应该先有自己的研究主题,应该从易到难,由表及里(好像初中、还是高中政治中说过这个,最近才明白,哈哈),不能违背这个定律,要不然自己会越研究越糊涂,也会很有挫败感。这篇博客就想从简单的问题和现象开始然后通过日志来证明自己的判断。

        问题: WebView播放视频是调用自带的播放器还是调用Android的系统的播放器?

        方法:

                    1、先从WebView开始,具体如下图:


                        


                          1)  WebViewFactory是对WebViewFactoryProvider的工厂类,是WebView主要的实现类。

                          2)  NullWebViewFactoryProvider什么都没有做,应该是预留的吧。

                          3)  WebViewChromiumFactoryProvider是调用Chromium。通过这个可以看出来,Android6.0已经切到Chrome内核了。

 

                        注意:WebViewChromiumFactoryProvider类在Andrid6.0中是找不到源码的,费了九牛二虎之力终于在external/chrome-weview 查找到webview.apk。通过反编译看到Chromium相关的代码。

                          以上是webView简单的流程,是通过研究代码可以得到的。


             2. Chromium源码内调用视频的个过程, 日志如下:

                09-25 14:28:28.119 1821-2699/ D/MediaResourceGetter: ethernet/wifi connection detected
                09-25 14:28:28.206 1821-2699/ E/MediaResourceGetter: Error configuring data source: setDataSource failed: status = 0x80000000
                09-25 14:28:28.206 1821-2699/ E/MediaResourceGetter: Unable to configure metadata extractor  

                通过日志可以发现调用Chromium中的MediaResourceGetter类。通过源码搜索只能找到第一处日志的打印代码,其他两处都找不到。该问题的分析不能进行下。


            3. 最后通过查看日志发现webView最后的调用MediaPlayer,日志如下:

                 09-11 14:34:24.334 13625-13625/com.smartcar.nightmode.browser W/MediaPlayer: Couldn't open file on client side; trying server side:           java.io.FileNotFoundException: No content provider: http://img0.singulato.com/video/goods.mp4
                 09-11 14:34:25.584 13625-13625/com.smartcar.nightmode.browser D/MediaPlayer: setSubtitleAnchor in MediaPlayer
                 09-11 14:34:25.593 13625-13625/com.smartcar.nightmode.browser D/MediaPlayer: getMetadata
                 09-11 14:34:25.835 13625-13770/com.smartcar.nightmode.browser W/MediaPlayer: info/warning (3, 0)

                 

                 同时通过代码简单实现VideoView播放本地视频,抓取日志如下:

                  09-11 14:32:05.980 12855-12919/com.test I/OpenGLRenderer: Initialized EGL, version 1.4
                  09-11 14:32:05.981 12855-12919/com.test W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
                  09-11 14:32:06.064 12855-12855/com.test W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: http://img0.singulato.com/video/goods.mp4
                  09-11 14:32:09.197 12855-12855/com.test D/MediaPlayer: getMetadata
                  09-11 14:32:09.448 12855-12867/com.test W/MediaPlayer: info/warning (3, 0)
  

                 通过以上日志对比基本上可以断定:webview播放视频最后调用的是Android本身的播放器。



        

       

  



      

原创粉丝点击