1. 程式人生 > >WebView 細節,onShowCustomView與JS注入來實現視訊全屏播放

WebView 細節,onShowCustomView與JS注入來實現視訊全屏播放

概述

WebView是開發中經常使用的元件,在使用中我們需要考慮 檔案下載自定義scheme重定向硬體加速CookieHTTPS/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)}中開啟硬體加速

相關原始碼:

擴充套件閱讀: