1. 程式人生 > >android webview無法開啟webgl解決以及騰訊x5核心的webview依然無法載入webgl的解決

android webview無法開啟webgl解決以及騰訊x5核心的webview依然無法載入webgl的解決

由於嵌入一個3d的導航,需要支援webgl,但是android 6.0及其以上都無法開大,網上搜資料發現騰訊x5webview可以,附上地址:

https://x5.tencent.com/tbs/index.html

但是在實際使用過程中碰到很多問題,結尾再說.
1.匯入jar和so檔案:
我是直接下載demo,然後將demo的裡so和jar下載下來,注意路徑別放錯,jar也要add library下。
jar:
在這裡插入圖片描述
so:
在這裡插入圖片描述

另外在build.gradle裡的defaultconfig還需要加上;

android{
defaultconfig{
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
}
}

2.必要的許可權:

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

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

3.Application設定初始化和硬體加速許可權:

        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean arg0) {
                // TODO Auto-generated method stub
                //x5核心初始化完成的回撥,為true表示x5核心載入成功,否則表示x5核心載入失敗,會自動切換到系統核心。
                Log.d("app", " onViewInitFinished is " + arg0);
            }

            @Override
            public void onCoreInitFinished() {
                // TODO Auto-generated method stub
            }
        };
        //x5核心初始化介面
        QbSdk.initX5Environment(getApplicationContext(),  cb);
            <application
        android:name=".APPAplication"
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

4.webview的封裝和設定:

public class WebViewFactory {

    public void init(com.tencent.smtt.sdk.WebView webView, String url, boolean flag, Context context) {

        com.tencent.smtt.sdk.WebSettings settings = webView.getSettings();
        settings.setBuiltInZoomControls(true);
        settings.setLayoutAlgorithm(com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        settings.setBlockNetworkImage(false);
        settings.setSupportZoom(true);
        settings.setSupportMultipleWindows(true);
        settings.setAppCacheEnabled(true);
        //居中
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setSavePassword(false);
        settings.setSaveFormData(false);
        settings.setJavaScriptEnabled(true);
        settings.setAllowFileAccess(true);
        settings.setGeolocationEnabled(true);
        settings.setAppCacheMaxSize(Long.MAX_VALUE);
        settings.setDomStorageEnabled(true);
        settings.setPluginState(com.tencent.smtt.sdk.WebSettings.PluginState.ON_DEMAND);
        settings.setCacheMode(com.tencent.smtt.sdk.WebSettings.LOAD_NO_CACHE);
        String dir = context.getDir("database", Context.MODE_PRIVATE).getPath();
        //設定定位的資料庫路徑
        settings.setGeolocationDatabasePath(dir);
        settings.setJavaScriptCanOpenWindowsAutomatically(true);
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
        webView.requestFocus();
        webView.loadUrl(url);
    }
}

外部使用:

         new WebViewFactory().init(webView, mUrl, true,this);
        webView.setWebChromeClient(webChromeClient);
        webView.setWebViewClient(webViewClient);
     //   webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        webView.getView().setClickable(true);
        webView.loadUrl(mUrl);

webviewclient的設定:

        @Override
        public boolean shouldOverrideUrlLoading(com.tencent.smtt.sdk.WebView webView, String s) {
                webView.loadUrl(s);
                return true;
        }

另外官網還有個工具可以測試你的工程是否將原生webview替換為了騰訊的webview,執行選擇要測試的路徑即可。
我之前匯入一直還是無法顯示的原因就是硬體加速和之前的設定:

webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

這句程式碼,之後即可開啟