一、场景描述
在Android混合开发中Html中可以播放视频,视频播放采用<Video>标签。视频可以全屏播放。
用这种方式播放视频在大部分机型下没啥问题,但是有部分机型全屏播放时会出现全屏按钮灰色不可点击或者点击全屏按钮直接白屏等问题。
解决方法也比较简单,分如下三步:
二、解决办法
第一步:
给WebView对应的Activity设置硬件加速。ps:此处是解决全屏按钮灰色不可点击或者全屏按钮出不来等问题
在AndroidManifest.xml中的对应的Activity中设置android:hardwareAccelerated = "true"
<activity android:name=".ui.h5.activity.WebViewActivity" android:screenOrientation="portrait" android:hardwareAccelerated = "true"/>
第二步:
在Activity或者Fragment中的WebView设置之前加上下面的代码:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED, WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
第三步:
设置WebView的WebChromeClient回调函数。并重写onShowCustomView和onHideCustomView。然后在这个两个方法中加入全屏展示和取消全屏展示时的相关代码。ps:点击全屏按钮会回调onshowCustomView点击取消全屏会调用onHideCustomView。具体代码如下所示:
//全局变量
private View mCustomView; //用于全屏渲染视频的View private IX5WebChromeClient.CustomViewCallback mCustomViewCallback;
//相关重写代码
mWebView.setWebChromeClient(new CustomJsWebChromeClient() { /** * 解决WebView播放视频点击全屏按钮白屏的问题。 * ps:如果去掉则部分机型视频全屏展示时有问题 */ @Override public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback customViewCallback) { super.onShowCustomView(view, customViewCallback); if (mCustomViewCallback != null) { mCustomViewCallback.onCustomViewHidden(); mCustomViewCallback = null; return; } getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); ViewGroup parent = (ViewGroup) mWebView.getParent().getParent(); parent.setVisibility(View.GONE); ((ViewGroup) parent.getParent()).addView(view, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); mCustomView = view; mCustomViewCallback = customViewCallback; } /** * 解决WebView播放视频点击全屏按钮白屏的问题。 * ps:如果去掉则部分机型视频全屏展示时有问题 */ @Override public void onHideCustomView() { super.onHideCustomView(); if (mCustomView != null) { if (mCustomViewCallback != null) { mCustomViewCallback.onCustomViewHidden(); mCustomViewCallback = null; } getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); if (mCustomView != null && mCustomView.getParent() != null) { ViewGroup parent = (ViewGroup) mCustomView.getParent(); parent.removeView(mCustomView); if (mWebView.getParent().getParent() != null) { ViewGroup parent2 = (ViewGroup) mWebView.getParent().getParent(); parent2.setVisibility(View.VISIBLE); } } mCustomView = null; } } }
//到此就结束了,大家不用关注setWebChromeClient的回调函数用的是不是Android原生的,重点关注回调函数中如上的两个回调方法就行了,不用做改动,直接copy就可以。