一、場景描述
在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就可以。
