android webview無法開啟webgl解決以及騰訊x5核心的webview依然無法載入webgl的解決
阿新 • • 發佈:2018-12-14
由於嵌入一個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);
這句程式碼,之後即可開啟