自强不息    厚德载物

【Android -- 开源库】腾讯 TBS 浏览器 SDK 接入

  2023/7/20 9:00:00   【次浏览】 本站

简介

在 Android 开发项目中,经常会用到 Webview 。而 WebView 是出了名的坑,各种 Bug。腾讯 TBS 浏览服务面向应用开发商和广大开发者,提供浏览增强,内容框架,广告体系,H5游戏分发,大数据等服务,能够帮助应用开发商大幅改善应用体验,有效提升开发,运营,商业化的效率。


官网地址: https://x5.tencent.com


1. 优势

速度快:相比系统webview的网页打开速度有30+%的提升;

省流量:使用云端优化技术使流量节省20+%;

更安全:安全问题可以在24小时内修复;

更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;

兼容好:无系统内核的碎片化问题,更少的兼容性问题;

体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;

功能全:在Html5、ES6上有更完整支持;

更强大:集成强大的视频播放器,支持视频格式远多于系统webview;

视频和文件格式的支持x5内核多于系统内核

防劫持是x5内核的一大亮点

其中,X5云端服务包括云加速、云安全、云转换三大功能。云加速是通过首屏加速、智能路由、图片压缩等技术保障网页浏览的快、省、悦;云安全是通过代理加密、URL安全检测、JS黑名单管理、负载监控等防范网页被劫持插入广告、保障网页浏览的安全稳定;云转换是使用URL聚合+XPATH的解决方案,解决移动阅读难题。


2. 运行环境

Android 版本: Android 4.0 ~ Android 12.0

CPU 架构:armeabi、armeabi-v7a、arm64-v8a

使用

1. 基础配置

1.1 SDK 接入

方式一:jar包方式集成(推荐)


您可将官网下载的jar包复制到您的App的libs目录,并且通过Add As Library的方式集成TBS SDK。


前往官网下载SDK


方式二:自动集成

使用 mavenCentral 仓库


在项目级别(通常是根目录下)的 build.gradle 中添加:


repositories {

    google()

    // 增加这行

    mavenCentral()

}


在应用级别(通常是 app 模块下)的 build.gradle 中添加依赖:


dependencies {

    ...

    // 增加这行

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

}


1.2 权限配置

在 AndroidManifest.xml 里权限声明


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

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

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

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

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


<!-- 硬件加速对X5视频播放非常重要,建议开启 -->

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


2. 代码

2.1 在 Application 初始化 x5 内核接口

/**

         * 搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。

         */

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

            @Override

            public void onViewInitFinished(boolean arg) {

                //x5內核初始化完成的回调,

                // true表示x5内核加载成功,

                // false表示x5内核加载失败,会自动切换到系统内核。

                Log.i("kevin", "X5内核是否成功加载= " + arg);

            }


            @Override

            public void onCoreInitFinished() {

            }

        };

        QbSdk.setTbsListener(new TbsListener() {

            @Override

            public void onDownloadFinish(int i) {

                Log.i("kevin", "onDownloadFinish: " + i);

            }


            @Override

            public void onInstallFinish(int i) {

                Log.i("kevin", "onInstallFinish: " + i);

            }


            @Override

            public void onDownloadProgress(int i) {

                Log.i("kevin", "onInstallFinish: " + i);

            }

        });


        QbSdk.initX5Environment(getApplicationContext(), callback);


2.2 初始化 WebSettings

private void initWebSettings() {

    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.setAppCacheEnabled(true);

    webSetting.setDomStorageEnabled(true);

    webSetting.setGeolocationEnabled(true);

    webSetting.setAppCacheMaxSize(Long.MAX_VALUE);

    webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);

    webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

}


2.3 简单封装

如果在项目中使用,一般来说最好是封装多一层。


防止和原生的WebView搞混

有什么问题,一改全改。

可以添加一些功能,例如进度条等。

/**

 * author: Kevin_Gong

 * date: 2023/6/1

 * desc: 封装一个带进图条的 WebView

 */

public class ProgressWebView extends WebView {

    //进度条

    private ProgressBar progressbar;


    //进度条的高度,默认10px

    private int progressHeight = 10;


    public ProgressWebView(Context context) {

        this(context,null);

    }


    public ProgressWebView(Context context, AttributeSet attributeSet) {

        super(context, attributeSet);

        initView(context);

    }


    private void initView(Context context) {

        //创建进度条

        progressbar = new ProgressBar(context, null,

                android.R.attr.progressBarStyleHorizontal);

        //设置加载进度条的高度

        progressbar.setLayoutParams(new AbsoluteLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, progressHeight, 0, 0));


        Drawable drawable = context.getResources().getDrawable(R.drawable.progress_bar_states);

        progressbar.setProgressDrawable(drawable);


        //添加进度到WebView

        addView(progressbar);


        //初始化 WebSettings

        initWebSettings();



        setWebChromeClient(new WVChromeClient());

        setWebViewClient(new WVClient());

    }


    private void initWebSettings() {

        WebSettings webSetting = this.getSettings();

        webSetting.setJavaScriptEnabled(true);

        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);

        webSetting.setAllowFileAccess(true);

        webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);

        webSetting.setSupportZoom(true);

        webSetting.setBuiltInZoomControls(true);

        webSetting.setUseWideViewPort(true);

        webSetting.setSupportMultipleWindows(true);

        webSetting.setAppCacheEnabled(true);

        webSetting.setDomStorageEnabled(true);

        webSetting.setGeolocationEnabled(true);

        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);

        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);

        webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

    }




    //进度显示

    private class WVChromeClient extends WebChromeClient {



        @Override

        public void onProgressChanged(WebView view, int newProgress) {

            if (newProgress == 100) {

                progressbar.setVisibility(GONE);

            } else {

                if (progressbar.getVisibility() == GONE) {

                    progressbar.setVisibility(VISIBLE);

                }

                progressbar.setProgress(newProgress);

            }


            if (mListener != null) {

                mListener.onProgressChange(view, newProgress);

            }


            super.onProgressChanged(view, newProgress);

        }


    }


    private class WVClient extends WebViewClient {


        @Override

        public boolean shouldOverrideUrlLoading(WebView view, String url) {


            //在当前Activity打开

            view.loadUrl(url);

            return true;

        }


        @Override

        public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

            //https忽略证书问题

            handler.proceed();

        }


        @Override

        public void onPageFinished(WebView view, String url) {


            progressbar.setVisibility(GONE);

            if (mListener != null) {

                mListener.onPageFinish(view);

            }


            super.onPageFinished(view, url);


        }


    }


    private onWebViewListener mListener;


    public void setOnWebViewListener(onWebViewListener listener) {

        this.mListener = listener;

    }


    //进度回调接口

    public interface onWebViewListener {

        void onProgressChange(WebView view, int newProgress);


        void onPageFinish(WebView view);

    }

}

手机扫码查看当前文章:

【Android -- 开源库】腾讯 TBS 浏览器 SDK 接入

如本网转载稿涉及版权等问题,请作者见稿后在两周内速来电与我们联系, 详见版权声明

  上一篇:微信公众号开发

 下一篇:Android开源库——xUtils框架