Android集成三方浏览器之Crosswalk
上一篇講解了騰訊 X5 內核的集成,這一篇是講解 Crosswalk 的集成 Crosswalk 也是采用了Chromenium 內核,是一款開源的 web 引擎,開發者可以直接把 Crosswalk 嵌入到應用之中,當然也支持共享模式(系統中沒有對應的 Crosswalk 庫是會提示下載)。只不過 Crosswalk 已經停止維護了。
Crosswalk官網
集成
想要使用 CrossWalk 有三種方式:
2.下載 zip 包后解壓,然后以用開發工具Import Module導入,作為一個library依賴。
推薦使用stable(穩定版)!其他的分別是beta(測試版),canary(金絲雀版)。下載最新版本的zip包:23.53.589.43.下載aar 下載aar包后導入項目的 lib目 錄下,然后在gradle中添加
repositories {flatDir {dirs 'libs'} } 復制代碼compile(name: 'crosswalk-23.53.589.4', ext: 'aar') 復制代碼使用
1.manifest中添加
android:hardwareAccelerated="true" //application節點下開啟硬件加速 復制代碼<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 復制代碼2.布局中添加
<org.xwalk.core.XWalkViewandroid:id="@+id/xwalkview"android:layout_width="match_parent"android:layout_height="match_parent"></org.xwalk.core.XWalkView> 復制代碼3.新建 Activity 繼承 XWalkActivity,onXWalkReady() 方法里面進行初始化操作
class MainActivity : XWalkActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)}override fun onXWalkReady() {XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, true); //開啟默認動畫var setting = xwalkview.settingssetting.loadWithOverviewMode = falsesetting.javaScriptEnabled = true //支持jssetting.javaScriptCanOpenWindowsAutomatically = true //支持通過JS打開新窗口setting.useWideViewPort = true //將圖片調整到合適webview的大小setting.loadWithOverviewMode = true //縮放至屏幕的大小setting.loadsImagesAutomatically = true //支持自動加載圖片setting.supportMultipleWindows() //支持多窗口setting.setSupportZoom(true)setting.allowFileAccess = truesetting.setDomStorageEnabled(true)setting.allowContentAccess = truesetting.allowContentAccess = truesetting.domStorageEnabled = truexwalkview.requestFocus()setting.cacheMode = WebSettings.LOAD_NO_CACHExwalkview.setResourceClient(object : XWalkResourceClient(xwalkview) {override fun onLoadStarted(view: XWalkView?, url: String?) {super.onLoadStarted(view, url)}override fun onLoadFinished(view: XWalkView?, url: String?) {super.onLoadFinished(view, url)}override fun shouldOverrideUrlLoading(view: XWalkView?, url: String?): Boolean {view?.loadUrl(url)return true}override fun onReceivedSslError(view: XWalkView?, callback: ValueCallback<Boolean>?, error: SslError?) {callback?.onReceiveValue(true)super.onReceivedSslError(view, callback, error)}override fun onReceivedLoadError(view: XWalkView?, errorCode: Int,description: String?, failingUrl: String?) {super.onReceivedLoadError(view, errorCode, description, failingUrl)}override fun onProgressChanged(view: XWalkView?, process: Int) {super.onProgressChanged(view, process)if (...) {...progressBar.setProgress(process)...} else {...}}})xwalkview.setUIClient(object :XWalkUIClient(xwalkview){override fun onJsAlert(view: XWalkView?, url: String?, message: String?, result: XWalkJavascriptResult?): Boolean {return super.onJsAlert(view, url, message, result)}override fun onReceivedTitle(view: XWalkView?, title: String?) {super.onReceivedTitle(view, title)}override fun openFileChooser(view: XWalkView?, uploadFile: ValueCallback<Uri>?, acceptType: String?, capture: String?) {super.openFileChooser(view, uploadFile, acceptType, capture)}})xwalkview.loadUrl("your url")}override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {if (xwalkview!=null){xwalkview.onActivityResult(requestCode, resultCode, data)}}override fun onNewIntent(intent: Intent?) {if (xwalkview != null) {xwalkview.onNewIntent(intent)}}override fun onDestroy() {super.onDestroy()XWalkPreferences.setValue(XWalkPreferences.ANIMATABLE_XWALK_VIEW, false);} } 復制代碼XWalkUIClient 對應系統 webview 中的 WebChromeClient
XWalkResourceClient 對應系統 webview 的 WebViewClient
- 監聽頁面生命
- 判斷頁面返回
提示
在使用 Crosswalk 的過程遇到了幾個問題,在這里提一下,希望能有一點幫助。
3.Crosswalk 加載 SSL 證書有問題的網站時會報 Rquest was denied for security
override fun onReceivedSslError(view: XWalkView?, callback: ValueCallback<Boolean>?, error: SslError?) {callback?.onReceiveValue(true) //系統webview中的是handler.process() } 復制代碼添加上述代碼后會回調 onReceivedLoadError并報net:: ERR_SECURITY_RESPONSE。這個問題折騰了很久,在 xwalkview的論壇 中發現 Crosswalk 會阻止連接到不信任的 SSL。
最后發現源碼中的 SsLUtil.java 會阻止加載。
public static boolean shouldDenyRequest(int error) {assert error >= -215 && error <= -200;switch (error){case -213:case -212:case -211:case -208:case -207:case -206:case -203: // case -202: case -201: // case -200: case -150:case -129:return true;}return false; } 復制代碼修改后的資源已忽略證書安全問題「不建議忽略證書安全問題,我是測試環境所需」
參考文檔:
Crosswalk官網
Crosswalk Api 文檔
Crosswalk 項目
官方論壇
最后
關于騰訊 X5 內核集成請跳轉:
Android集成三方瀏覽器之X5內核
轉載于:https://juejin.im/post/5b4ef7a56fb9a04fc5649dff
總結
以上是生活随笔為你收集整理的Android集成三方浏览器之Crosswalk的全部內容,希望文章能夠幫你解決所遇到的問題。