android 整合最新X5WebView 以及离线安装教程

在build.gradle中添加依赖
 

implementation 'com.tencent.tbs:tbssdk:44216'

为了保障内核的动态下发和正常使用,您需要在您的AndroidManifest.xml增加如下权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

为了保障X5功能的正常使用,您需要在您的proguard-rules.pro文件中添加如下混淆配置:

-keepattributes Exceptions

-keep class com.tencent.smtt.export.external.**{*;}
-keep class com.tencent.smtt.export.internal.**{*;}

 首次初始化冷启动优化

// 在调用TBS初始化、创建WebView之前进行如下配置 
HashMap map = new HashMap(); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true); 
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true); 
QbSdk.initTbsSettings(map);

 在项目启动类加入此代码
 


        /* 设置允许移动网络下进行内核下载。默认不下载,会导致部分一直用移动网络的用户无法使用x5内核 */
        QbSdk.setDownloadWithoutWifi(true);

        QbSdk.setCoreMinVersion(QbSdk.CORE_VER_ENABLE_202112);
        /* SDK内核初始化周期回调,包括 下载、安装、加载 */

        QbSdk.setTbsListener(new TbsListener() {

            /**
             * @param stateCode 用户可处理错误码请参考{@link com.tencent.smtt.sdk.TbsCommonCode}
             */
            @Override
            public void onDownloadFinish(int stateCode) {
                Log.i("TAG", "onDownloadFinished: " + stateCode);
            }

            /**
             * @param stateCode 用户可处理错误码请参考{@link com.tencent.smtt.sdk.TbsCommonCode}
             */
            @Override
            public void onInstallFinish(int stateCode) {
                Log.i("TAG", "onInstallFinished: " + stateCode);
//                if(stateCode==200){
//                    ToastUtils.showToast("初始化X5内核成功。。。。",mContext);
//                }
            }

            /**
             * 首次安装应用,会触发内核下载,此时会有内核下载的进度回调。
             * @param progress 0 - 100
             */
            @Override
            public void onDownloadProgress(int progress) {
                Log.i("TAG", "Core Downloading: " + progress);
            }
        });

        /* 此过程包括X5内核的下载、预初始化,接入方不需要接管处理x5的初始化流程,希望无感接入 */
        QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {
            @Override
            public void onCoreInitFinished() {
                // 内核初始化完成,可能为系统内核,也可能为系统内核
            }

            /**
             * 预初始化结束
             * 由于X5内核体积较大,需要依赖wifi网络下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
             * 内核下发请求发起有24小时间隔,卸载重装、调整系统时间24小时后都可重置
             * 调试阶段建议通过 WebView 访问 debugtbs.qq.com -> 安装线上内核 解决
             * @param isX5 是否使用X5内核
             */
            @Override
            public void onViewInitFinished(boolean isX5) {
                Log.i("TAG", "onViewInitFinished: " + isX5);
                // hint: you can use QbSdk.getX5CoreLoadHelp(context) anytime to get help.
                if(isX5){
                    ToastUtils.showToast("X5内核安装成功。。。。",mContext);
                }else{
                    ToastUtils.showToast("X5内核安装失败。。。。",mContext);
                    initX5WebView();
                }
            }
        });
    // 在调用TBS初始化、创建WebView之前进行如下配置 
    HashMap map = new HashMap(); 
    map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true); 
    map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true); 
    QbSdk.initTbsSettings(map);

或者在 AndroidManifest.xml配置新增

<service 
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" >
</service>

布局文件

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/li_jitsi"
        android:orientation="vertical"
        android:background="#ffffff"
        android:layout_marginTop="?attr/actionBarSize">
        <com.tencent.smtt.sdk.WebView
            android:id="@+id/webView"
            android:visibility="visible"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    </LinearLayout>

        webView = mView.findViewById(R.id.webView);   
        WebSettings ws = webView.getSettings();
        ws.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);//设置布局,会引起WebView的重新布局(relayout),默认值NARROW_COLUMNS
        ws.setLoadsImagesAutomatically(true);//自动加载图片资源
        ws.setJavaScriptCanOpenWindowsAutomatically(true);
        ws.setJavaScriptEnabled(true);//执行javascript脚本
        ws.setUseWideViewPort(true);//支持HTML的“viewport”标签或者使用wide viewport
        ws.setLoadWithOverviewMode(true);//缩小内容以适应屏幕宽度
        ws.setGeolocationEnabled(true);//启用定位
        ws.setAppCacheEnabled(true);
        ws.setDomStorageEnabled(true);//启用DOM存储API
        ws.setDefaultTextEncodingName("utf-8");//设置编码格式
        webView.requestFocus();
        webView.canGoForward();
        webView.canGoBack();
        webView.addJavascriptInterface(new JsInterface(mContext,roomName),"AndroidWebView");


        String JITSI_URL = SharedPUtils.findByKey(mContext,"JITSI_URl");
        webView.loadUrl(JITSI_URL);
        //覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开
        webView.setWebViewClient(new WebViewClient(){
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
         
                view.loadUrl(url);
                return true;
            }
            @Override
            public void onReceivedSslError(WebView var1, SslErrorHandler handler, SslError var3) {
                handler.proceed(); //表示等待证书响应
                //handler.cancel(); //表示挂起连接,为默认方式
                // handler.handleMessage(null); //可做其他处理

            }
        });
        webView.setWebChromeClient(new WebChromeClient(){
            @Override
            public void onPermissionRequest(final PermissionRequest request) {
                request.grant(request.getResources());
            }
        });

注意引用的包:

然后运行项目 当

            /**
             * 预初始化结束
             * 由于X5内核体积较大,需要依赖wifi网络下发,所以当内核不存在的时候,默认会回调false,此时将会使用系统内核代替
             * 内核下发请求发起有24小时间隔,卸载重装、调整系统时间24小时后都可重置
             * 调试阶段建议通过 WebView 访问 debugtbs.qq.com -> 安装线上内核 解决
             * @param isX5 是否使用X5内核
             */
            @Override
            public void onViewInitFinished(boolean isX5) {
                Log.i("TAG", "onViewInitFinished: " + isX5);
                // hint: you can use QbSdk.getX5CoreLoadHelp(context) anytime to get help.
                if(isX5){
                    ToastUtils.showToast("X5内核安装成功。。。。",mContext);
                }else{
                    ToastUtils.showToast("X5内核安装失败。。。。",mContext);
                    initX5WebView();
                }
            }

 isX5 为true 说明内核下载成功,但是X5webview 很多机型都首次都下载不了, 所以我又尝试 了离线安装,但是app打包的apk会增加40M左右,可以参考地址
TBS文件浏览自主安装内核方案_ThankSars的博客-CSDN博客_tbs内核

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在 Android WebView 实现离线时加载原来的缓存页面,你可以使用以下步骤: 1. 设置 WebView 的缓存模式为 `LOAD_CACHE_ELSE_NETWORK`,这样 WebView 会优先加载缓存,如果缓存不存在才从网络加载数据。可以使用 `setCacheMode` 方法设置缓存模式: ```java webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); ``` 2. 确保 WebView 启用了 DOM 存储和数据库存储功能,这样可以在离线时仍然能够使用相关的本地存储数据。可以使用以下方法启用这些功能: ```java webView.getSettings().setDomStorageEnabled(true); webView.getSettings().setDatabaseEnabled(true); ``` 3. 在加载 WebView 的网页之前,检查设备的网络连接状态。如果设备处于离线状态,你可以手动加载缓存的页面,否则 WebView 将按照缓存模式加载页面。示例代码如下: ```java ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = cm.getActiveNetworkInfo(); if (networkInfo == null || !networkInfo.isConnected()) { // 设备离线状态 webView.loadUrl("file:///android_asset/offline.html"); // 加载离线页面 } else { // 设备在线状态,WebView 根据缓存模式加载网页 webView.loadUrl("https://example.com"); // 加载网页 } ``` 在上述代码中,如果设备处于离线状态,则加载位于 assets 目录下的 offline.html 页面,你可以根据需要替换为你自己的离线页面路径。 通过以上步骤,当设备处于离线状态时,WebView 将加载之前缓存的页面,而不是尝试从网络加载新的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值