1. 程式人生 > >Android Webview 騰訊TBS X5 瀏覽器核心接入-解決低版本android手機無法相容某些H5導致白屏的問題

Android Webview 騰訊TBS X5 瀏覽器核心接入-解決低版本android手機無法相容某些H5導致白屏的問題

所有的頁面跳轉,都在一個webView中,各種第三方的跳轉,視訊播放,分享等等功能!真是叫人頭大!尤其是視訊播放這塊,要整成橫向的全屏模式,試了各種方法,總是豎屏!於是想起之前看到的一個部落格說是騰訊的遊覽器核心SDK是免費提供的,到網上一查,它提供的功能確實滿足!尤其是在載入視訊的時候,會載入它自己的解碼器,播放器的介面也蠻好看的!接下來,大家就懂了!先做一個demo試試唄!

開始擼程式碼!

官方下載地址:  https://x5.tencent.com/tbs/sdk.html

注:你下載的SDK可能不是含有*.so檔案,所以最好也再下載一個demo。

第一步,新增jar包:

第二步,配置你的Application檔案:

第三步,新增相關的so包:

由於X5只提供了一個so包,所以對應的相關CPU架構包都拷貝一個進去!(64位的架構也對應的這個so包!不明白的可以到官網看解釋!)

第四步,新增build.gradle配置:

第五步,把demo中簡單封裝的webView匯入工程(當然,你也可以直接用jar包中的):

package com.example.administrator.testh5.utils;

import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Build; import android.util.AttributeSet; import android.view.View; import android.widget.TextView;

import com.tencent.smtt.sdk.QbSdk; import com.tencent.smtt.sdk.WebSettings; import com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm; import com.tencent.smtt.sdk.WebView; import com.tencent.smtt.sdk.WebViewClient;

public class X5WebView extends WebView {     TextView title;     private WebViewClient client = new WebViewClient() {         /**          * 防止載入網頁時調起系統瀏覽器          */         public boolean shouldOverrideUrlLoading(WebView view, String url) {             view.loadUrl(url);             return true;         }     };

    @SuppressLint("SetJavaScriptEnabled")     public X5WebView(Context arg0, AttributeSet arg1) {         super(arg0, arg1);         this.setWebViewClient(client);         // this.setWebChromeClient(chromeClient);         // WebStorage webStorage = WebStorage.getInstance();         initWebViewSettings();         this.getView().setClickable(true);     }

    private void initWebViewSettings() {         WebSettings webSetting = this.getSettings();         webSetting.setJavaScriptEnabled(true);         webSetting.setJavaScriptCanOpenWindowsAutomatically(true);         webSetting.setAllowFileAccess(true);         webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);         webSetting.setSupportZoom(true);         webSetting.setBuiltInZoomControls(true);         webSetting.setUseWideViewPort(true);         webSetting.setSupportMultipleWindows(true);         // webSetting.setLoadWithOverviewMode(true);         webSetting.setAppCacheEnabled(true);         // webSetting.setDatabaseEnabled(true);         webSetting.setDomStorageEnabled(true);         webSetting.setGeolocationEnabled(true);         webSetting.setAppCacheMaxSize(Long.MAX_VALUE);         // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);         webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);         // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);         webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

        // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension         // settings 的設計     }

    @Override     protected boolean drawChild(Canvas canvas, View child, long drawingTime) {         boolean ret = super.drawChild(canvas, child, drawingTime);         canvas.save();         Paint paint = new Paint();         paint.setColor(0x7fff0000);         paint.setTextSize(24.f);         paint.setAntiAlias(true);         if (getX5WebViewExtension() != null) {             canvas.drawText(this.getContext().getPackageName() + "-pid:"                     + android.os.Process.myPid(), 10, 50, paint);             canvas.drawText(                     "X5  Core:" + QbSdk.getTbsVersion(this.getContext()), 10,                     100, paint);         } else {             canvas.drawText(this.getContext().getPackageName() + "-pid:"                     + android.os.Process.myPid(), 10, 50, paint);             canvas.drawText("Sys Core", 10, 100, paint);         }         canvas.drawText(Build.MANUFACTURER, 10, 150, paint);         canvas.drawText(Build.MODEL, 10, 200, paint);         canvas.restore();         return ret;     }

    public X5WebView(Context arg0) {         super(arg0);         setBackgroundColor(85621);     }

} 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697

第六步,介面展示叻:

package com.example.administrator.testh5;

import android.content.res.Configuration; import android.graphics.PixelFormat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.ViewGroup; import android.webkit.JavascriptInterface; import android.widget.FrameLayout; import android.widget.Toast;

import com.example.administrator.testh5.utils.WebViewJavaScriptFunction; import com.example.administrator.testh5.utils.X5WebView; import com.tencent.smtt.export.external.interfaces.IX5WebChromeClient; import com.tencent.smtt.export.external.interfaces.JsResult; import com.tencent.smtt.sdk.WebChromeClient; import com.tencent.smtt.sdk.WebView;

public class MainActivity extends AppCompatActivity {     private WebView mWebView;

    String url="http://learn.clponline.cn/learnspace/sign/signLearn.action?params.template=2&loginType=true&sign=mobile&courseId=ff8080815b00afa0015b061aa9cd0269&siteCode=puhsc&domain=jy.clponline.cn&loginId=studentljx";

//    String url="https://jinmingli.webtrn.cn/whaty-jwplayer/demo1.html";     /**      * 用於演示X5webview實現視訊的全屏播放功能 其中注意 X5的預設全屏方式 與 android 系統的全屏方式      */

    X5WebView webView;

    @Override     protected void onCreate(Bundle savedInstanceState) {         // TODO Auto-generated method stub         super.onCreate(savedInstanceState);         setContentView(R.layout.filechooser_layout);         webView = (X5WebView) findViewById(R.id.web_filechooser);         webView.loadUrl(url);         getWindow().setFormat(PixelFormat.TRANSLUCENT);

        webView.getView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);         webView.addJavascriptInterface(new MyJs(), "android");         webView.setWebChromeClient(new WebChromeClient());

    }

    public class MyJs{

        @JavascriptInterface         public String back(){

            enableX5FullscreenFunc();             Toast.makeText(MainActivity.this,"js呼叫android成功!",Toast.LENGTH_SHORT).show();

            System.out.println("kkkkkkkkkkkkk");

            return "android!";         }

    }

    @Override     public void onConfigurationChanged(Configuration newConfig) {         // TODO Auto-generated method stub         try {             super.onConfigurationChanged(newConfig);             if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {

            } else if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {

            }         } catch (Exception e) {             e.printStackTrace();         }

    }

    // /////////////////////////////////////////     // 向webview發出資訊     private void enableX5FullscreenFunc() {

        if (webView.getX5WebViewExtension() != null) {             Toast.makeText(this, "開啟X5全屏播放模式", Toast.LENGTH_LONG).show();             Bundle data = new Bundle();

            data.putBoolean("standardFullScreen", false);// true表示標準全屏,false表示X5全屏;不設定預設false,

            data.putBoolean("supportLiteWnd", false);// false:關閉小窗;true:開啟小窗;不設定預設true,

            data.putInt("DefaultVideoScreen", 2);// 1:以頁面內開始播放,2:以全屏開始播放;不設定預設:1

            webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",                     data);         }     }

    private void disableX5FullscreenFunc() {         if (webView.getX5WebViewExtension() != null) {             Toast.makeText(this, "恢復webkit初始狀態", Toast.LENGTH_LONG).show();             Bundle data = new Bundle();

            data.putBoolean("standardFullScreen", true);// true表示標準全屏,會調起onShowCustomView(),false表示X5全屏;不設定預設false,

            data.putBoolean("supportLiteWnd", false);// false:關閉小窗;true:開啟小窗;不設定預設true,

            data.putInt("DefaultVideoScreen", 2);// 1:以頁面內開始播放,2:以全屏開始播放;不設定預設:1

            webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",                     data);         }     }

    private void enableLiteWndFunc() {         if (webView.getX5WebViewExtension() != null) {             Toast.makeText(this, "開啟小窗模式", Toast.LENGTH_LONG).show();             Bundle data = new Bundle();

            data.putBoolean("standardFullScreen", false);// true表示標準全屏,會調起onShowCustomView(),false表示X5全屏;不設定預設false,

            data.putBoolean("supportLiteWnd", true);// false:關閉小窗;true:開啟小窗;不設定預設true,

            data.putInt("DefaultVideoScreen", 2);// 1:以頁面內開始播放,2:以全屏開始播放;不設定預設:1

            webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",                     data);         }     }

    private void enablePageVideoFunc() {         if (webView.getX5WebViewExtension() != null) {             Toast.makeText(this, "頁面內全屏播放模式", Toast.LENGTH_LONG).show();             Bundle data = new Bundle();

            data.putBoolean("standardFullScreen", false);// true表示標準全屏,會調起onShowCustomView(),false表示X5全屏;不設定預設false,

            data.putBoolean("supportLiteWnd", false);// false:關閉小窗;true:開啟小窗;不設定預設true,

            data.putInt("DefaultVideoScreen", 1);// 1:以頁面內開始播放,2:以全屏開始播放;不設定預設:1

            webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams",                     data);         }     }

} 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153

注:下面提供的幾個方法,是控制webView中視訊的窗體的,如果點選直接播放就可以直接初始化webView後,直接新增即可!

還需注意的是AndroidManifest.xml中,開啟硬體加速:

<!-- 硬體加速對X5視訊播放非常重要,建議開啟 -->     <uses-permission android:name="android.permission.GET_TASKS" />12

對應的Activity的configChanges設定:

android:configChanges="orientation|screenSize|keyboardHidden"1

到這,基本這個工程就跑起來了!並且能整成的播放,全屏和半屏播放了!

接下來,總結一下整合過程中遇到的坑:

1.如果你在Application中的初始化總是返回:false。那可能是這幾種情況:

a.仔細檢查,你的jar包是否匯入,so檔案是否加入 b.看看你的build.gradle,是否配置了ndk c.檢查你的測試機是否安裝了QQ或者微信或者QQ瀏覽器(需要共享X5核心) d.如果上幾步都沒有問題,建議重新啟動一下開發環境(我就是這種情況(原因不明)) 1234

2.處理左上角的除錯資訊

找到X5WebView,註釋這個方法中的內容: 

3.適配  如果你是跟我一樣,在主選單介面開始播放,當開始全屏播放的時候,選單欄會戰部分介面,  導致無法全屏,進過測試,android 7.0以下的,你呼叫onConfigurationChanged進行選單的隱藏顯示就OK的,但是android 7.0以及android7.0以上的是不會走這個方法的,但是sdk也並沒有提供監聽全屏的介面(可能我沒有找到),我的處理方法是定時器判斷webView的高度和寬度進行選單的隱藏個和顯示(很土的解決方案,我自己都鄙視我自己)!

OK,基本就到了,今天為止,就搞了一天,可能有些api還不是很熟悉!有好的建議和方法歡迎交流!謝謝!

Demo GitHub地址:  https://github.com/T-chuangxin/TbsTestH5Demo

原文:https://blog.csdn.net/qq_25497621/article/details/78561357