WebView 細節,onShowCustomView與JS注入來實現視訊全屏播放
阿新 • • 發佈:2019-02-06
概述
WebView
是開發中經常使用的元件,在使用中我們需要考慮 檔案下載
,自定義scheme
,重定向
,硬體加速
,Cookie
,HTTPS/HTTP混合
等多種問題。
關於 WebView
之前的總結
更多參考:
而在WebView
中播放視訊,這種場景非常多,需要H5
和本地配合才能完成。一種方案是使用onShowCustomView
回撥的方式,另一種方案就是 JS
繫結回撥的方式,。
過程中會遇到如下問題:
關於騰訊視訊源 下的視訊放大 事件問題
解決方案和參考
針對視訊放大的需求,當即一想非常的簡單,但是會有一個問題,那就是 非自己的視訊源
,比如騰訊的視訊,採用騰訊自己的iframe
onShowCustomView
貼出如下一些參考方案:
使用onShowCustomView
VideoEnabledWebChromeClientConfig lVideoEnabledWebChromeClientConfig =
VideoEnabledWebChromeClientConfig.newBuilder()
.mNonVideoLayout(nonVideoLayout)
.mVideoLayout(videoLayout)
.mLoadingView(loadingView)
.mWebView(webView)
.mToggledFullscreenCallback(mToggledFullscreenCallback)
.build();
webChromeClient = new VideoEnabledWebChromeClient(
lVideoEnabledWebChromeClientConfig);
webView.setWebChromeClient(webChromeClient);
// Navigate anywhere you want, but consider that this classes have only been tested on YouTube's mobile site
webView.loadUrl("http://m.youtube.com");
JS注入的方式
這是通過設定 JavascriptInterface
國內視訊源
地址下 事件影藏的比較深
,核心程式碼 JsInjectActivity.java:
/**
* 對不同的視訊網站分析相應的全屏控制元件
*
* @param url 載入的網頁地址
* @return 相應網站全屏按鈕的class標識
*/
public static String referParser(String url) {
if (url.contains("letv")) {
return "hv_ico_screen"; //樂視Tv
} else if (url.contains("youku")) {
return "x-zoomin"; //優酷
} else if (url.contains("bilibili")) {
return "icon-widescreen"; //bilibili
} else if (url.contains("qq")) {
return "tvp_fullscreen_button"; //騰訊視訊
}
return null;
}
總結
- 播放視訊,需要開啟硬體加速
- 為了讓
webview
點選link
能夠下載,需要新增{@link android.webkit.DownloadListener}
WebView
重定向判斷可以用{@link android.webkit.WebView#getHitTestResult()}
HTTPS
頁面中的HTTP
元素不顯示,如圖片,可以用{@link android.webkit.WebSettings#setMixedContentMode(int)}
Webview
開啟硬體加速會出現各種坑,可以在{@link WebViewClient#onPageStarted(android.webkit.WebView, java.lang.String, android.graphics.Bitmap)}
中關閉硬體加速,在
{@link WebViewClient#onPageFinished(android.webkit.WebView, java.lang.String)}
中開啟硬體加速
相關原始碼:
擴充套件閱讀: