Android集成三方浏览器之Crosswalk

上一篇讲解了腾讯 X5 内核的集成,这一篇是讲解 Crosswalk 的集成 Crosswalk 也是采用了Chromenium 内核,是一款开源的 web 引擎,开发者可以直接把 Crosswalk 嵌入到应用之中,当然也支持共享模式(系统中没有对应的 Crosswalk 库是会提示下载)。只不过 Crosswalk 已经停止维护了。

Crosswalk官网

集成

想要使用 CrossWalk 有三种方式:

  1. maven 远程依赖
//配置gradle
   repositories {
        maven {
            url 'https://download.01.org/crosswalk/releases/crosswalk/android/maven2'
        }
    }
compile 'org.xwalk:xwalk_core_library:23.53.589.4'

2.下载 zip 包后解压,然后以用开发工具Import Module导入,作为一个library依赖。


推荐使用stable(稳定版)!其他的分别是beta(测试版),canary(金丝雀版)。下载最新版本的zip包:23.53.589.4

3.下载aar
下载aar包后导入项目的 lib目 录下,然后在gradle中添加

repositories {
    flatDir {
        dirs 'libs'
    }
}

使用

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.XWalkView
        android:id="@+id/xwalkview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </org.xwalk.core.XWalkView>

3.新建 Activity 继承 XWalkActivityonXWalkReady() 方法里面进行初始化操作

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.settings
        setting.loadWithOverviewMode = false
        setting.javaScriptEnabled = true                        //支持js
        setting.javaScriptCanOpenWindowsAutomatically = true    //支持通过JS打开新窗口
        setting.useWideViewPort = true                          //将图片调整到合适webview的大小
        setting.loadWithOverviewMode = true                     //缩放至屏幕的大小
        setting.loadsImagesAutomatically = true                 //支持自动加载图片
        setting.supportMultipleWindows()                        //支持多窗口
        setting.setSupportZoom(true)
        setting.allowFileAccess = true
        setting.setDomStorageEnabled(true)
        setting.allowContentAccess = true
        setting.allowContentAccess = true
        setting.domStorageEnabled = true
        xwalkview.requestFocus()
        setting.cacheMode = WebSettings.LOAD_NO_CACHE
        xwalkview.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 对应系统 webviewWebViewClient

  • 监听页面生命
override fun onResume() {
    super.onResume()
    xwalkview?.let {
        xwalkview.pauseTimers()
        xwalkview.onHide()
    }
}
override fun onPause() {
    super.onPause()
    xwalkview?.let {
        xwalkview.pauseTimers()
        xwalkview.onHide()
    }
}
  • 判断页面返回
if (xwalkview.navigationHistory.canGoBack()) {
    xwalkview.getNavigationHistory().navigate(
            XWalkNavigationHistory.Direction.BACKWARD, 1)
} else {
    finish()
}

提示

在使用 Crosswalk 的过程遇到了几个问题,在这里提一下,希望能有一点帮助。

  1. lang.RuntimeException: Crosswalk's APIs are not ready yet异常:请在onready里面进行相关设置和加载页面
  2. 使用第一种 maven 集成方式 可能会报资源异常

    在你的 build.gradle 中添加:
configurations.all {
    resolutionStrategy {
        force 'com.android.support:support-v4:27.1.0'//自己的版本号
    }
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269