Android在项目中接入腾讯TBS浏览器WebView的教程与注意的地方

来源:互联网 发布:centos ant安装 编辑:程序博客网 时间:2024/04/29 17:30

腾讯TBS浏览器服务

我们都知道,在Android开发中,经常会用到Webview,而且WebView是出了名的坑的,各种bug。这时候腾讯老哥站出来了,搞了一个TBS浏览器服务这个东西。 说得这么屌,其实就是一个webView控件,然后解析解析网页的内核是他自己做的,叫X5内核(系统原生的WebView用的是WebKit内核),所以我们开发者用的时候,主要就是用这个com.tencent.smtt.sdk.WebView控件

当然这个控件有很多功能,当然也有些要注意的地方。

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

1. 特殊功能:

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

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

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

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

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

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

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

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

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

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

2. 运行环境

  • 手机ROM版本高于或等于2.2版本

  • 手机RAM大于500M,该RAM值通过手机 /proc/meminfo 文件的MemTotal动态获取

注:如果不满足上述条件,SDK会自动切换到系统WebView,SDK使用者不用关心该切换过程。

3. SDK尺寸指标

  • SDK提供的JAR包约293K

4. 原生和X5 WebView的类对应表

系统内核SDK内核android.webkit.ConsoleMessagecom.tencent.smtt.export.external.interfaces.ConsoleMessageandroid.webkit.CacheManagercom.tencent.smtt.sdk.CacheManager(deprecated)android.webkit.CookieManagercom.tencent.smtt.sdk.CookieManagerandroid.webkit.CookieSyncManagercom.tencent.smtt.sdk.CookieSyncManagerandroid.webkit.CustomViewCallbackcom.tencent.smtt.export.external.interfaces.IX5WebChromeClient.CustomViewCallbackandroid.webkit.DownloadListenercom.tencent.smtt.sdk.DownloadListenerandroid.webkit.GeolocationPermissionscom.tencent.smtt.export.external.interfaces.GeolocationPermissionsCallbackandroid.webkit.HttpAuthHandlercom.tencent.smtt.export.external.interfaces.HttpAuthHandlerandroid.webkit.JsPromptResultcom.tencent.smtt.export.external.interfaces.JsPromptResultandroid.webkit.JsResultcom.tencent.smtt.export.external.interfaces.JsResultandroid.webkit.SslErrorHandlercom.tencent.smtt.export.external.interfaces.SslErrorHandlerandroid.webkit.ValueCallbackcom.tencent.smtt.sdk.ValueCallbackandroid.webkit.WebBackForwardListcom.tencent.smtt.sdk.WebBackForwardListandroid.webkit.WebChromeClientcom.tencent.smtt.sdk.WebChromeClientandroid.webkit.WebHistoryItemcom.tencent.smtt.sdk.WebHistoryItemandroid.webkit.WebIconDatabasecom.tencent.smtt.sdk.WebIconDatabaseandroid.webkit.WebResourceResponsecom.tencent.smtt.export.external.interfaces.WebResourceResponseandroid.webkit.WebSettingscom.tencent.smtt.sdk.WebSettingsandroid.webkit.WebSettings.LayoutAlgorithmcom.tencent.smtt.sdk.WebSettings.LayoutAlgorithmandroid.webkit.WebStoragecom.tencent.smtt.sdk.WebStorageandroid.webkit.WebViewcom.tencent.smtt.sdk.WebViewandroid.webkit.WebViewClientcom.tencent.smtt.sdk.WebViewClient

在APP中集成

1. 导Jar包

去这个网址: http://x5.tencent.com/tbs/sdk.html ,看到Android SDK(完整版) 这个就是Jar包,下载回来放到你项目的lib文件夹,右键add as library即可。

2. 权限

在Manifest添加下面的权限

<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" />

3. 初始化X5内核

在Application里面使用QbSdk.initX5Environment进行初始化X5内核,第一个参数传入context,第二个参数传入PreInitCallback,不需要callback的可以传入null。 
initX5Environment内部会创建一个线程向后台查询当前可用内核版本号,这个函数内是异步执行所以不会阻塞 App 主线程,这个函数内是轻量级执行所以对App启动性能没有影响,当App后续创建webview 时就可以首次加载x5内核了:

public class BaseApplicatiom extends Application {    @Override    public void onCreate() {        super.onCreate();        //初始化X5内核        QbSdk.initX5Environment(this, new QbSdk.PreInitCallback() {            @Override            public void onCoreInitFinished() {                //x5内核初始化完成回调接口,此接口回调并表示已经加载起来了x5,有可能特殊情况下x5内核加载失败,切换到系统内核。            }            @Override            public void onViewInitFinished(boolean b) {                //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。                Log.e("@@","加载内核是否成功:"+b);            }        });    }}

4. 使用WebView

然后需要用到WebView的时候,在布局这样子下面这样子写,注意要全路径com.tencent.smtt.sdk.WebView:

<com.tencent.smtt.sdk.WebView        android:id="@+id/twv_test"        android:layout_width="match_parent"        android:layout_height="match_parent"/>

其余使用方法基本和系统的WebView一样,例如js的交互是,也是一样的addJavascriptInterface,所以使用成本还不算高。但是有些是需要注意的,继续看下去:

高级一点的使用

1. 全屏播放视频

页面的Activity需要声明:

android:configChanges="orientation|screenSize|keyboardHidden"

视频为了避免闪屏和透明问题,Activity在onCreate时需要设置:

//这个对宿主没什么影响,建议声明getWindow().setFormat(PixelFormat.TRANSLUCENT);

在非硬绘手机和声明需要controller的网页上,视频切换全屏和全屏切换回页面内会出现视频窗口透明问题,需要在activity的style进行如下设置:

<!-- 声明为不透明,这个视各app情况所需,不强制需求,如果声明了,对体验更有利 --><item name="android:windowIsTranslucent">false</item>

以下接口禁止(直接或反射)调用,避免视频画面无法显示:

webview.setLayerType()webview.setDrawingCacheEnabled(true);

2. 输入法

避免输入法界面弹出后遮挡输入光标的问题,所在的Activity添加属性:

android:windowSoftInputMode="stateHidden|adjustResize"

或者 在ActivityonCreate时候代码设置也行:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

3. 自定义UA

UA是什么? 
userAgent,用户代理。是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。作用就是告诉网页我这个是什么系统。

如果 app 需要自定义 UA,建议采取在 SDK 默认UA 后追加 app UA 的方式。示例:

//其中APP_NAME_UA是app自定义UAwebSetting.setUserAgentString(webSetting.getUserAgentString() + APP_NAME_UA);

4. 额外的视频播放器

没错,这货还提供了一个视频播放的功能,下面官方的说明:

TBS不仅提供了强大的网页浏览功能,更提供了强大的页面H5视频播放支持,播放器同时支持页面,小窗,全屏播放体验,强大的解码能力,包括mp4,rmvb,flv,avi等26种视频格式支持。

TBS播放器的播放场景不仅局限于H5页面播放,也可以接入一般的视频流链接,比如本地文件,网络的视频流链接。开发者如果想播放一个视频链接,在不自己开发播放器的前提下,一般做法是将视频的播放链接放到一个Intent里面,抛给系统的播放器进行播放,那么当你集成了TBS后,你只需要通过简单的方式接入视频播放调用接口,这样你不需要写任何一句关于播放器的代码,就可以享受一个本地播放器体验,播放视频再不需要Intent来跨App、跨进程的调用了。

第一步,在Manifest添加Activity声明:

<activity    android:name="com.tencent.smtt.sdk.VideoActivity"    android:configChanges="orientation|screenSize|keyboardHidden"    android:exported="false"    android:launchMode="singleTask"    android:alwaysRetainTaskState="true">        <intent-filter>            <action android:name="com.tencent.smtt.tbs.video.PLAY" />            <category android:name="android.intent.category.DEFAULT" />        </intent-filter></activity>

第二步,调用播放视频的调用接口,通过TbsVideo的静态方法,如下:

//判断当前Tbs播放器是否已经可以使用。public static boolean canUseTbsPlayer(Context context)//直接调用播放接口,传入视频流的urlpublic static void openVideo(Context context, String videoUrl)//extraData对象是根据定制需要传入约定的信息,没有需要可以传如nullpublic static void openVideo(Context context, String videoUrl, Bundle extraData)

5. 文件选择器

官方demo中有。简单说一下流程

WebChromeClient里面有回调openFileChooser、onShowFileChooser方法。

点击了网页的控件就可以回调上面的方法

在回调方法里面我们利用Intent打开文件选择器

然后选择完文件后在onActivityResult回调里面进行获取,然后利用ValueCallback<Uri>或者ValueCallback<Uri[]>onReceiveValue进行返回路径给网页。

注意的地方

1. cookie的调整

com.tencent.smtt.sdk.CookieManagercom.tencent.smtt.sdk.CookieSyncManager的相关接口的调用,在接入SDK后,需要放到创建X5的WebView之后(也就是X5内核加载完成)进行;否则,cookie的相关操作只能影响系统内核。

2. WebView宽高的获取

由于SDK WebView所提供的WebView类,是对系统WebView的聚合包装,所以:获取系统内核的WebView或者 x5内核的WebView的宽高需要这样:

webView.getView().getWidth();

3. X5内核

开始说了,这个腾讯的WebView使用的是自己的X5内核。

如果你的手机有安装QQ、微信、QQ浏览器等等QQ的产品, 这个内核就已经是已经安装到手机上了。

如果都没有,在Application初始化调用initX5Environment方法的时候,会进行离线安装,失败就会自动切换自用自带内核。

如果都都没有,而且手机没有链接网络,需要离线,这时候需要打包内核进app,app包增大20M左右, X5内核在哪里下载? 联系这货: http://bbs.mb.qq.com/user/196302

那怎么判断他是使用X5内核还是自带内核呢? 
显示网页文字时,可通过长按选择文字的标识判断,如下水滴状选择效果是x5webview的标志: 
技术分享

4. 64位手机的兼容

x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行。具体操作如下:

如果使用是Eclipse 
需要将所有的.so文件都放置在so加载目录:lib/armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网http://x5.tencent.com/tbs/sdk.html下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),lib文件夹下不要有其他以”armeabi“开头的文件夹。

如果使用的是Android Studio:

1、打开对应module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(如果没有defaultConfig{}则手动添加),添加如下配置:

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

如果配置后编译报错,那么需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;

2、打开http://x5.tencent.com/tbs/sdk.html,下载SDK接入示例,拷贝对应目录下的liblbs.so文件,到你的armeabi目录下,具体可以参考他的栗子。 
技术分享

这个链接查看64位的手机,你没有64位的手机的话,可以看看下面有什么手机是64位的,去优测里面进行测试 
http://product.pconline.com.cn/mobile/qg/c6427_c14390/s5.shtml

5. 混淆

jar包本来就已经是混淆好的了,如果你打包时候没有添加规则再混淆一遍的话,就会无法使用x5内核了。所以需要添加混淆规则:

下载混淆文件:http://res.imtt.qq.com/TES/proguard_20160822.zip

解压后用文本编辑器打开,复制里面的内容到你项目的proguard-rules.pro混淆文件即可。

简单包装

如果在项目中使用,一般来说最好是封装多一层。 
- 防止和原生的WebView搞混 
- 有什么问题,一改全改。 
- 可以添加一些功能,例如进度条等。

这里给一个简单加进度条的封装,在项目中使用的话,你在布局文件里面使用路径+ProgressWebview即可

public class ProgressWebview extends WebView {    private ProgressBar progressbar;  //进度条    private int progressHeight = 10;  //进度条的高度,默认10px    public ProgressWebview(Context context) {        super(context);        initView(context);    }    public ProgressWebview(Context context, AttributeSet attributeSet) {        super(context, attributeSet);        initView(context);    }    private void initView(Context context) {        //开启js脚本支持        getSettings().setJavaScriptEnabled(true);        //创建进度条        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);        //适配手机大小        getSettings().setUseWideViewPort(true);        getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);        getSettings().setLoadWithOverviewMode(true);        getSettings().setSupportZoom(true);        getSettings().setBuiltInZoomControls(true);        getSettings().setDisplayZoomControls(false);        setWebChromeClient(new WVChromeClient());        setWebViewClient(new WVClient());    }    //进度显示    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);    }}
阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ie浏览器页面显示网页错误怎么办 Ⅵvo手机声音小怎么办 小米手机预约错了怎么办 小米note二手没解锁怎么办 艾灸后脸色越黑怎么办 淘宝软件类目不能上架宝贝怎么办 ae中没有mpg格式怎么办 淘宝小二处理不公怎么办 遇到卖保险的人怎么办 租房合同没理家电清单怎么办 普雪油烟机坏了怎么办 我累了 真的累了怎么办 u盘15g变成4g了怎么办 属兔的买了东户怎么办 玩时时彩输了2万怎么办 胸变的又软又小怎么办 u盘16g变成4g了怎么办 1岁宝宝吃了就吐怎么办 脚崴了肿了很痛怎么办 九格拼图5在9那怎么办 4s锁屏密码忘了怎么办 6p触屏偶尔乱跳怎么办 新办劳务公司的劳务资质怎么办 汽车没电了打不着火怎么办 吃凉的甜的牙疼怎么办 学车对点对不上怎么办 发现老公有外遇最明智的怎么办 想开个童装店但是没经验怎么办 母乳不够吃宝宝又不喝奶粉怎么办 掉头发很厉害怎么办有什么偏方 红米2a刷死机了怎么办 公司退市我们买的股票怎么办 黑魂3把npc杀了怎么办 摔倒了膝盖摔肿了又痛怎么办 厕所堵了怎么办疏通马桶有妙招 月经不来怎么办如何让它快点来 苹果手机进水了开不了机怎么办 苹果5s进水了怎么办修要多少钱 吃了过期3年的药怎么办 离婚后孩子的抚养费不给怎么办 小车钥匙丢了怎么办配要多少钱