Android集成三方浏览器之Crosswalk
上一篇讲解了腾讯 X5
内核的集成,这一篇是讲解 Crosswalk
的集成 Crosswalk
也是采用了Chromenium
内核,是一款开源的 web
引擎,开发者可以直接把 Crosswalk
嵌入到应用之中,当然也支持共享模式(系统中没有对应的 Crosswalk
库是会提示下载)。只不过 Crosswalk
已经停止维护了。
Crosswalk官网
集成
想要使用 CrossWalk
有三种方式:
maven
远程依赖
//配置gradlerepositories {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'}
}
复制代码
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
- 监听页面生命
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
的过程遇到了几个问题,在这里提一下,希望能有一点帮助。
lang.RuntimeException: Crosswalk's APIs are not ready yet
异常:请在onready里面进行相关设置和加载页面- 使用第一种
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内核
转载于:https://juejin.im/post/5b4ef7a56fb9a04fc5649dff
Android集成三方浏览器之Crosswalk相关推荐
- Android集成三方浏览器之X5内核,讲的明明白白
腾讯 X5 内核也是基于 chromium 的,相比原生的 WebView 而言,优化了用户的浏览体验.SDK 是通过共享使用用户手机上微信.手机QQ.QQ空间等软件已经下载好的 X5 内核.SDK ...
- [转]Android 和 iPhone 浏览器之战,第 2 部分: 为 iPhone 和 Android 构建基于浏览器的应用程序...
简介: 本文是共两部分的系列文章 "Android 和 iPhone 浏览器之战" 的第 2 部分,主要关注为 iPhone 和 Android 开发基于浏览器的应用程序.在第 1 ...
- Android 集成Chrome 浏览器内核 Crosswalk
Crosswalk 内核的兴起与消亡 Android 4.4 版本之前,使用的是基于 androidWebKit 的 WebView 但实际上,由于 Android 的碎片化问题(大量存在不同的 An ...
- 使用IntelliJ IDEA 13搭建Android集成开发环境(图文教程)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Google 与微软的浏览器之争
浏览器再现"神仙打架". 整理 | 屠敏 头图 | CSDN 下载自东方 IC 出品 | CSDN(ID:CSDNnews) 从 IE 到 Chrome,再从 Chrome 到 E ...
- android 三方_面试官送你一份Android热门三方库源码面试宝典及学习笔记
前言 众所周知,优秀源码的阅读与理解是最能提升自身功力的途径,如果想要成为一名优秀的Android工程师,那么Android中优秀三方库源码的分析和理解则是必备技能.就拿比较热门的图片加载框架Glid ...
- Netscape与IE的浏览器之争
Netscape与IE的浏览器之争 1992年,在伊利诺斯州大学里,一个20岁出头.尚未毕业的计算机科学专业的大学生,每天除了上课,就是在NCSA(美国的国家超级计算中心)工 作.这天,一群同年龄的大 ...
- 网景如何才能打败微软而赢得浏览器之战?
网景如何才能打败微软而赢得浏览器之战? 内容提要:比尔盖茨在<未来之路>中介绍了他是如何通过正反馈理论打败所有竞争对手,使微软系统成为行业标准的.微软依仗其在操作系统中的统治地位,它可以通 ...
- Android集成MuPDF,修改批注默认红色墨迹为黑色墨迹
概述 前段时间由于项目需要,要在手机上对PDF文件进行预览.签名.上传等操作,经过各种分析.调研及测试,最终决定用mupdf.(好像目前能对pdf文档支持搜索,标注等功能,也只有mupdf可以实现) ...
最新文章
- EXP1 PC平台逆向破解
- vnctf——babyvm
- java web的运行方式_在运行 Javaweb项目时报错,不知道什么原因,百度了好多方法跟着人家的方法做了还是报错...
- mnesia数据库学习笔记四
- 方立勋_30天掌握JavaWeb_使用httpUrlConnection模似ie
- (3.5)HarmonyOS鸿蒙多按钮点击事件
- Spire.Pdf 的各种操作总结
- 使用Newtonsoft.Json接受部分资源
- Linux修改history存储的最大记录数
- AI 修复 100 年前晚清影像喜提热搜,有穿越内味儿了!
- 步入restful之前先了解一下localStorage
- springboot GeoLite2-City.mmdb实现通过IP地址获取经纬度以及该IP的所属地区
- Java等额本息算法实现
- 教你用arduino控制LCD1602液晶屏的底层程序实现(全网最笨的方法)
- pygame精灵组有哪些方法_pygame 的精灵使用
- DbVisualizer 8.0.11 出现乱码问题
- 机械臂控制软件,上位机软件 此机器人上位软件。 运动采用通用G代码指令编程,具有G5三维的空间圆弧插补,空间直线插补功能
- 二硫化钼量子点修饰纳米金棒/CdS纳米棒|二硫化钼量子点/g-C3N4复合光催化剂|马来酰亚胺修饰二硫化钼MoS2-MAL
- 线性代数笔记(线性方程组、线性空间,线性变换)
- 【东游记】美东大环线:华盛顿--费城--纽约--西点--耶鲁--波士顿--美加大瀑布
热门文章
- 魅族 虚拟位置服务状态:未运行_魅族17评测:「重量平衡设计」 手感出色 魅友们的5G梦想旗舰...
- Java和C/C++程序实时通讯数据移植问题的研究
- GHOST装双系统图文教程
- Windows下安装苹果iPhone开发环境xcode图文教程
- windows gtk+ 开发环境搭建
- java卡片布局例子_Java编程使用卡片布局管理器示例【基于swing组件】
- eslint 保存自动格式化_ESLint一款可组装的JavaScript和JSX检查工具
- c语言获取按键,c语言获得键盘的按键
- adcclk最大_TMS320F28xxADC配置说明中文版
- mysql select查询语句_mysql的select查询语句