Android实现在当前进程打开网页可以将Cordova中的WebView嵌入Android项目中,实现简单,不需要自己实现,所以掌握如何嵌入WebView对项目快速开发很有帮助
官方也有这方面的教程操作,但最新版本的cordova android(4.0.0)对其代码库做了大的改动。这种变化,大多是一种设计模式,使得上面描述的方法不能正常工作。
本文将展示如何与cordova Android的新变化合作,嵌入cordova webview在本机Android应用程序。
创建Cordova安卓项目
cordova create test_cordova com.example.hello HelloWorld
cordova platform add android
cordova plugin add nl.x-services.plugins.toast
cordova plugin add org.apache.cordova.device
cordova build上面第三行和第四行是将其他的第三方插件也嵌入安卓原生工程使用
创建Android Native项目public classMainActivity extends Activity {@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public voidstartCordovaActivity(View view) {Intent intent= new Intent(this, TestCordovaActivity.class);startActivity(intent);}public voidstartCordovaActivityWithLayout(View view) {Intent intent= new Intent(this, TestCordovaWithLayoutActivity.class);startActivity(intent);}}startCordovaActivity 将转移到一个新活动,其布局是以程序方式创建的cordova webview。
startCordovaActivity 将转移到一个新的活动,其布局使用xml布局文件定义并嵌入cordova webview。TestCordovaActivitypublic classTestCordovaActivity extends CordovaActivity {public voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);super.init();//Load your applicationlaunchUrl = "file:///android_asset/www/index.html";//launchUrl = "file:///android_asset/www/index2.html";
loadUrl(launchUrl);}
}不需要xml布局,加载的是index.html网页
TestCordovaWithLayoutActivitypublic classTestCordovaWithLayoutActivity extends CordovaActivity {/** Called when the activity is first created.*/@Overridepublic voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_test_cordova_with_layout);super.init();//Load your application//launchUrl = "file:///android_asset/www/index.html"launchUrl = "file:///android_asset/www/index2.html";loadUrl(launchUrl);}@OverrideprotectedCordovaWebView makeWebView() {SystemWebView webView=(SystemWebView)findViewById(R.id.cordovaWebView);return new CordovaWebViewImpl(newSystemWebViewEngine(webView));}@Overrideprotected voidcreateViews() {//Why are we setting a constant as the ID? This should be investigated//appView.getView().setId(100);//appView.getView().setLayoutParams(new FrameLayout.LayoutParams(//ViewGroup.LayoutParams.MATCH_PARENT,//ViewGroup.LayoutParams.MATCH_PARENT));//
//setContentView(appView.getView());if (preferences.contains("BackgroundColor")) {int backgroundColor = preferences.getInteger("BackgroundColor", Color.BLACK);//Background of activity:
appView.getView().setBackgroundColor(backgroundColor);}appView.getView().requestFocusFromTouch();}}public classMain2Activity extends Activity implements CordovaInterface{privateSystemWebView cordova_webview;private String TAG = "CORDOVA_ACTIVITY";private final ExecutorService threadPool =Executors.newCachedThreadPool();@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main2);cordova_webview=(SystemWebView) findViewById(R.id.cordova_web_view);//从4.x开始CordovaWebView不再是View的子类,用SystemWebView代替//下面这行代码非常关键,如果没有这行,的、diveceready就没有执行,显灰色状态cordova_webview.getSettings().setJavaScriptEnabled(true);//Config.init(this);String url = "file:///android_asset/www/index.html";cordova_webview.loadUrl(url);}@Overridepublic void startActivityForResult(CordovaPlugin cordovaPlugin, Intent intent, inti) {Log.d(TAG,"setActivityResultCallback is unimplemented");}@Overridepublic voidsetActivityResultCallback(CordovaPlugin cordovaPlugin) {Log.d(TAG,"startActivityForResult is unimplemented");}@OverridepublicActivity getActivity() {return this;}@OverridepublicObject onMessage(String s, Object o) {Log.d(TAG, s);if (s.equalsIgnoreCase("exit")) {super.finish();}return null;}@OverridepublicExecutorService getThreadPool() {returnthreadPool;}
}使用setContentView显式设置布局xml。需要重写两个方法:makeWebView: 它使用R.id.cordovaWebView,在layout xml文件中定义
createViews : 我们重写它只是因为它将默认使用setContentView。但是我们想使用我们的xml布局,所以需要它。activity_test_cordova_with_layout.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.example.jimmy.embeddedcordovawebviewdemo.TestCordovaWithLayoutActivity"><TextViewandroid:layout_width="match_parent"android:layout_height="100dp"android:background="#FF0000"android:textColor="#FFFFFF"android:gravity="center"android:text="This is native text view"/><org.apache.cordova.engine.SystemWebViewandroid:id="@+id/cordovaWebView"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>为了向后兼容,我们使用cordova库中的org.apache.cordova.engine.SystemWebView,直到4.0.0之前也是可以使用org.apache.cordova.CordovaWebView
将Cordova Android项目复制到本机Android应用程序
拷贝jar包
去Apache官方网站下载最新的cordova Android Packet,然后创建jar包。官方网站
下载好官方压缩文件cordova-android-xxx.zip,解压缩,通过ant工具导航到 /framework目录下,执行ant jar命令,如果提示
build fali, you need to create the file'local.properties' by running 'android update project -p .'命令,在cmd窗口执行如上命令之后再次执行ant jar
将会在当前目录生成cordova-4.0.0.jar
拷贝jar包到项目中,在build.gradle中添加依赖
compile files('libs/cordova-4.0.0.jar')拷贝www目录
目录结构如下
platforms/android/assets/www -> src/main/assets/www
拷贝插件
注意:拷贝platforms/android/src/目录结构下的所有文件,而不是plugins/下的所有文件。因为在运行cordova build命令时,cordova将复制plugins/文件夹下的插件到目录platforms/android/src/下,并执行一些操作。
拷贝config.xml
注意:不要拷贝更目录下的config.xml,要拷贝的是platforms下的config.xml
目录结构如下
platforms/android/res/xml/config.xml -> src/main/res/xml/整个工程的目录结构如下图所示:若工程点击事件报错:06-11 17:47:24.708 12895-12895/com.intbird.soft.cordoca I/chromium﹕ [INFO:CONSOLE(41)] “Refused to execute inline event handler because it violates the following Content Security Policy directive: “default-src ‘self’ data: gap: https://ssl.gstatic.com ‘unsafe-eval’”. Note that ‘script-src’ was not explicitly set, so ‘default-src’ is used as a fallback. “, source: file:///android_asset/www/index.html (41)
直接注释掉 index.html meta 第一行,重新运行<html><head><!-- <meta http-equiv="Content-Security-Policy" content="default-src 'self' data: gap: https://ssl.gstatic.com 'unsafe-eval'; style-src 'self' 'unsafe-inline'; media-src *">--><meta name="format-detection" content="telephone=no"><meta name="msapplication-tap-highlight" content="no"><meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width"><link rel="stylesheet" type="text/css" href="css/index.css"><script type="text/javascript" charset="utf-8" src="cordova.js"></script><script type="text/javascript" charset="utf-8" src="js/index.js"></script><title>Hello World</title></head><body οnlοad="onPageLoad()"><input type="button" οnclick="btnStartActivity('web')" value="使用webView" class="button"/><br/><input type="button" οnclick="btnStartActivity('camera')" value="使用相机" class="button"/><br/><input type="button" οnclick="btnStartActivity('')" value="未处理" class="button"/></body>
</html>参考文献:http://cordova.apache.org/docs/en/5.0.0/guide_platforms_android_webview.md.html
http://richardgilmour.co.uk/2013/03/03/embedding-a-cordova-webview-in-a-native-android-app/
https://github.com/Adobe-Marketing-Cloud-Apps/app-sample-android-phonegap/wiki/Embed-Webview-in-Android-Fragment
作者:samychen
链接:https://www.jianshu.com/p/6be7ba97ad8a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/Jeely/p/11320069.html

UCML 原生Android中嵌入Cordova Webview相关推荐

  1. Android中ScrollView嵌套WebView

    2019独角兽企业重金招聘Python工程师标准>>> Android中WebView用来加载html页面,自带滑动效果.ScrollView同样也是自带滑动效果,在项目中如果需要W ...

  2. 随笔:说说第一次在android中嵌入非全屏显示的unity游戏时的坑之——界面切换时出现延迟/卡顿/花屏等现象解决方法

    One 最近对接了个unity3D做的小游戏到android项目中:游戏嵌入项目的界面且非全屏显示,项目几经波折,到我手上的时候,已经采用了在同一个activity中用两个View来分别显示andro ...

  3. android webview第三方框架,Android 中使用第三方 WebView,腾讯X5浏览器

    由于Android自带的webview,在低于4.3的手机上面不支持socket,因此寻求其他的解决方案,第一次应用中尝试加入Crosswallk,应用的体积整整大了40M,倒是也可以正常使用,app ...

  4. android开发rn插件,在Android原生应用中嵌入React Native

    开发工具:Android Studio , WebStorm 参考链接:React Native官方中文文档 一.创建React Native项目 1.在本地React Native项目目录下,创建一 ...

  5. 前端开发:H5页面判断是否在微信、原生iOS、原生Android中打开的使用

    前言 在前端开发的时候,关于和原生端或者微信端等交互的时候,会涉及到页面判断在不同的客户端打开不同的效果,这就是关于H5页面中判断在哪种客户端打开的范畴.主要是通过获取当前打开的客户端类型在进行处理的 ...

  6. Android中scrollview与webview冲突事件

    原文链接:http://www.linuxidc.com/Linux/2014-03/98847.htm ----------------------------------------------- ...

  7. android 清除cookie,Android 获取和清除 WebView 中的 Cookie

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 项目中如果用到了 WebView,那就免不了跟 Cookie 打交道. 比如,你时常需要判断用户的登录状态,如果用户未登 ...

  8. linux和安卓交互,Android中webview和js之间的交互及注意事项

    1.Android中利用webview调用网页上的js代码. Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true ...

  9. flutter不支持热更新_在iOS原生项目中使用Flutter,热更新

    前言: Flutter 因其自建的渲染引擎,背靠谷歌的支持,近来俘获了不少的开发小伙伴,越来越多的开发者尝试使用Flutter进行开发,在原生项目中嵌入Flutter来完成复杂度不高的页面成为了一个不 ...

最新文章

  1. 数据库常用sql语句
  2. 任何一个正整数都可以用2的幂次方表示(C语言版)
  3. 表弟面试被虐,我教他缓存连招,借机蹭了波奈雪的茶
  4. Spring Boot系列(一) Spring Boot介绍和基础POM文件
  5. 北京严厉打击违规发布网络房源信息行为 18家机构被查处
  6. 在VB中INI文件的读写、删除(对中文支持很好)
  7. Open3d之点云顶点法线估计
  8. Linux文件导出到Windows乱码的问题
  9. python上下文管理器ContextLib及with语句
  10. ubuntu 上的python不能解析jpeg,png?
  11. 计算机专业认识实习目的,计算机专业实习目的与意义
  12. libopus 实现pcm 编码到opus
  13. matlab两个单引号是什么意思,两个单引号什么时候用
  14. 好看的colormap颜色
  15. BMS-Pro电池巡检综合监控系统
  16. 激活函数(Activation Function)及十大常见激活函数
  17. luffcc项目-11-购物车实现,切换有效期选项、购物车商品的删除操作,结算页面,订单的生成
  18. safari html5插件安装,Safari巧用小插件 体验不输第三方浏览器
  19. 如何将m3u8格式转成MP4以及可播放格式
  20. java流程图中平行四边形代表什么_程序流程图中通常用平行四边形表示分支结构...

热门文章

  1. Vue2基础-Vue2.x 多层级组件数据通信 EventBus 和 Vuex
  2. 一长为 l,密度均匀的柔软链条,其单位长度的密度为 λ。将其卷成一堆放在地面上。若手握链条的一端,以匀 速 v 将其上提。当绳端提离地面的高度为 x 时,证明手 的提力为 = + 。...
  3. ArcEngine面转线
  4. Yolov5-5.0源码分享以及环境配置——Yolov5训练及测试教程(超详细含数据集制作,格式转换,数据集划分)
  5. 图片上传实现(搭建Nginx图片服务器[第五课])
  6. Debug调试程序的方法
  7. Referer 超长
  8. QtVideoConference Qt视频会议系统源码下载 Qt-UI
  9. LFM雷达实现及USRP验证【章节1:LFM基本原理】
  10. Vulkan学习(九): Vertex Input Description Vertex Buffer Creation