android webview无法打开webgl解决以及腾讯x5内核的webview依然无法加载webgl的解决

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/kururunga/article/details/85001014

由于嵌入一个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);

这句代码,之后即可打开

猜你喜欢

转载自blog.csdn.net/kururunga/article/details/85001014