Android browser 的视频播放功能与以下几个文件有关, 位于目录frameworks/base/core/java/android/webkit/下:
HTML5Audio.java
HTML5VideoFullScreen.java
HTML5VideoInline.java
HTML5VideoView.java
HTML5VideoViewProxy.java
其中,HTML5Audio.java处理音频,暂且不讨论。
HTML5VideoFullScreen.java为全屏播放控制;HTML5VideoInline.java为inline模式播放,也即在浏览器窗口内播放,非全屏幕模式;HTML5VideoView.java和HTML5VideoViewProxy.java共同负责管理视频播放的流程。
对视频播放的全屏的进入和退出,首先注意在HTML5VideoViewProxy 类内内有私有类VideoPlayer。这个类在UI线程执行,用以控制播放逻辑。函数enterFullScreenVideo()在进入全屏模式时调用,做若干准备工作,创建一个HTML5VideoFullScreen的实例,最后调用HTML5VideoView类内的enterFullScreenVideoState()函数。该函数本身被消息ENTER_FULLSCREEN触发。ENTER_FULLSCREEN在函数enterFullscreenForVideoLayer内发出。enterFullScreenVideoState()在inline和fullscreen模式下有不同的实现。HTML5VideoFullScreen和HTML5VideoInline分别继承HTML5VideoView,重载函数enterFullScreenVideoState()。在HTML5VideoInline,enterFullScreenVideoState()没有任何操作,是完全继承父类的空函数。在HTML5VideoFullScreen中,enterFullScreenVideoState()创建一个FrameLayout,包含VideoView和progress view,并将全屏的视频窗口置于前台,位于browser窗口之上。
在native层,与视频全屏播放相关的有以下几个文件,external/webkit/Source/WebKit/android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp,
external/webkit/Source/WebCore/html/HTMLMediaElement.cpp
HTMLMediaElement::updatePlayState()中有逻辑判断是否需要进入全屏模式,如需要,则进入;否则以inline模式播放。