簡介
在 Android 開發(fā)項目中,經(jīng)常會用到 Webview 。而 WebView 是出了名的坑,各種 Bug。騰訊 TBS 瀏覽服務(wù)面向應(yīng)用開發(fā)商和廣大開發(fā)者,提供瀏覽增強,內(nèi)容框架,廣告體系,H5游戲分發(fā),大數(shù)據(jù)等服務(wù),能夠幫助應(yīng)用開發(fā)商大幅改善應(yīng)用體驗,有效提升開發(fā),運營,商業(yè)化的效率。
官網(wǎng)地址: https://x5.tencent.com
1. 優(yōu)勢
- 速度快:相比系統(tǒng)webview的網(wǎng)頁打開速度有30+%的提升;
- 省流量:使用云端優(yōu)化技術(shù)使流量節(jié)省20+%;
- 更安全:安全問題可以在24小時內(nèi)修復(fù);
- 更穩(wěn)定:經(jīng)過億級用戶的使用考驗,CRASH率低于0.15%;
- 兼容好:無系統(tǒng)內(nèi)核的碎片化問題,更少的兼容性問題;
- 體驗優(yōu):支持夜間模式、適屏排版、字體設(shè)置等瀏覽增強功能;
- 功能全:在Html5、ES6上有更完整支持;
- 更強大:集成強大的視頻播放器,支持視頻格式遠多于系統(tǒng)webview;
- 視頻和文件格式的支持x5內(nèi)核多于系統(tǒng)內(nèi)核
- 防劫持是x5內(nèi)核的一大亮點
其中,X5云端服務(wù)包括云加速、云安全、云轉(zhuǎn)換三大功能。云加速是通過首屏加速、智能路由、圖片壓縮等技術(shù)保障網(wǎng)頁瀏覽的快、省、悅;云安全是通過代理加密、URL安全檢測、JS黑名單管理、負載監(jiān)控等防范網(wǎng)頁被劫持插入廣告、保障網(wǎng)頁瀏覽的安全穩(wěn)定;云轉(zhuǎn)換是使用URL聚合+XPATH的解決方案,解決移動閱讀難題。
2. 運行環(huán)境
- Android 版本: Android 4.0 ~ Android 12.0
- CPU 架構(gòu):armeabi、armeabi-v7a、arm64-v8a
使用
1. 基礎(chǔ)配置
1.1 SDK 接入
方式一:jar包方式集成(推薦)
您可將官網(wǎng)下載的jar包復(fù)制到您的App的libs目錄,并且通過Add As Library的方式集成TBS SDK。
前往官網(wǎng)下載SDK
方式二:自動集成
使用 mavenCentral 倉庫
在項目級別(通常是根目錄下)的 build.gradle 中添加:
repositories {
google()
// 增加這行
mavenCentral()
}
在應(yīng)用級別(通常是 app 模塊下)的 build.gradle 中添加依賴:
dependencies {
...
// 增加這行
implementation 'com.tencent.tbs:tbssdk:44286'
}
1.2 權(quán)限配置
在 AndroidManifest.xml
里權(quán)限聲明文章來源:http://www.zghlxwxcb.cn/news/detail-681335.html
<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 內(nèi)核接口
/**
* 搜集本地tbs內(nèi)核信息并上報服務(wù)器,服務(wù)器返回結(jié)果決定使用哪個內(nèi)核。
*/
QbSdk.PreInitCallback callback = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg) {
//x5內(nèi)核初始化完成的回調(diào),
// true表示x5內(nèi)核加載成功,
// false表示x5內(nèi)核加載失敗,會自動切換到系統(tǒng)內(nèi)核。
Log.i("kevin", "X5內(nèi)核是否成功加載= " + 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 簡單封裝
如果在項目中使用,一般來說最好是封裝多一層。文章來源地址http://www.zghlxwxcb.cn/news/detail-681335.html
- 防止和原生的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) {
//創(chuàng)建進度條
progressbar = new ProgressBar(context, null,
android.R.attr.progressBarStyleHorizontal);
//設(shè)置加載進度條的高度
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;
}
//進度回調(diào)接口
public interface onWebViewListener {
void onProgressChange(WebView view, int newProgress);
void onPageFinish(WebView view);
}
}
到了這里,關(guān)于【Android -- 開源庫】騰訊 TBS 瀏覽器 SDK 接入的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!