国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android在項目中接入騰訊TBS瀏覽器WebView的教程與注意的地方

2019-10-21 21:37:36
字體:
來源:轉載
供稿:網友

騰訊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.ConsoleMessage                  com.tencent.smtt.export.external.interfaces.ConsoleMessage
  • android.webkit.CacheManager                       com.tencent.smtt.sdk.CacheManager(deprecated)
  • android.webkit.CookieManager                      com.tencent.smtt.sdk.CookieManager
  • android.webkit.CookieSyncManager              com.tencent.smtt.sdk.CookieSyncManager
  • android.webkit.CustomViewCallback com.tencent.smtt.export.external.interfaces.IX5WebChromeClient.CustomViewCallback
  • android.webkit.DownloadListener                  com.tencent.smtt.sdk.DownloadListener
  • android.webkit.GeolocationPermissions com.tencent.smtt.export.external.interfaces.GeolocationPermissionsCallback
  • android.webkit.HttpAuthHandler                     com.tencent.smtt.export.external.interfaces.HttpAuthHandler
  • android.webkit.JsPromptResult                      com.tencent.smtt.export.external.interfaces.JsPromptResult
  • android.webkit.JsResult                                   com.tencent.smtt.export.external.interfaces.JsResult
  • android.webkit.SslErrorHandler                      com.tencent.smtt.export.external.interfaces.SslErrorHandler
  • android.webkit.ValueCallback                         com.tencent.smtt.sdk.ValueCallback
  • android.webkit.WebBackForwardList            com.tencent.smtt.sdk.WebBackForwardList
  • android.webkit.WebChromeClient                 com.tencent.smtt.sdk.WebChromeClient
  • android.webkit.WebHistoryItem                      com.tencent.smtt.sdk.WebHistoryItem
  • android.webkit.WebIconDatabase                 com.tencent.smtt.sdk.WebIconDatabase
  • android.webkit.WebResourceResponse     com.tencent.smtt.export.external.interfaces.WebResourceResponse
  • android.webkit.WebSettings                           com.tencent.smtt.sdk.WebSettings
  • android.webkit.WebSettings.LayoutAlgorithm   com.tencent.smtt.sdk.WebSettings.LayoutAlgorithm
  • android.webkit.WebStorage                            com.tencent.smtt.sdk.WebStorage
  • android.webkit.WebView                                 com.tencent.smtt.sdk.WebView
  • android.webkit.WebViewClient                      com.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內核還是自帶內核呢? 
顯示網頁文字時,可通過長按選擇文字的標識判斷,如下水滴狀選擇效果是x5webview的標志:

Android,騰訊TBS瀏覽器,WebView

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目錄下

5. 混淆

jar包本來就已經是混淆好的了,如果你打包時候沒有添加規則再混淆一遍的話,就會無法使用x5內核了。所以需要添加混淆規則:

下載混淆文件:http://res.imtt.qq.com/TES/proguard.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); }}

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 阳新县| 宝清县| 察雅县| 嫩江县| 沙田区| 台安县| 洪洞县| 邹城市| 新邵县| 黎城县| 綦江县| 平山县| 应城市| 江口县| 鹿泉市| 青海省| 兰西县| 贵南县| 花垣县| 阳新县| 吉木乃县| 岑溪市| 五指山市| 开封县| 建水县| 蛟河市| 临桂县| 应用必备| 丹凤县| 衡水市| 辰溪县| 石阡县| 巴塘县| 班玛县| 西昌市| 乌兰察布市| 中江县| 牙克石市| 顺平县| 敦化市| 德清县|