在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内核