Cordova下android与javascript的交互

Android项目中集成Cordova的详细解析 通过将Cordova集成到Android项目中,我们可以在Android应用中嵌入Web视图,并使用JavaScript与原生功能进行交互。这是将Cordova集成到Android项目中的详细步骤。通过遵循这些步骤,您可以在Android应用中成功嵌入Cordova WebView,并使用Web技术构建功能丰富的移动应用程序。如果您计划在Android项目中使用Cordova插件,则需要在项目中添加这些插件的依赖项。在Android项目的布局文件中,添加一个用于显示Cordova WebView的视图。 阅读详情

最近做了一个功能,公司是用html写的上层,需要调用android自带的语音合成和识别,原以为是直接与html交互,结果没想到上层是用cordova的框架写的,研究一天把cordova与android的交互实现了,现在记录一下实现流程
由于是第一次用到Cordova,所以把它的搭建android项目和实现流程一并写上。


一、用Cordova搭建一个android工程。

  • 下载nodejs,并配置环境变量(默认)
    打开https://nodejs.org/en/,下载nodejs并安装,安装好默认是配置好环境变量的(我下载的v4.5.0LTS这个版本),输入npm如图即装好
    nodejs

  • 安装Cordova      npm install -g cordova

    Cordova

  • 创建一个cordova工程     cordova create (工程名) (包名)

    这里写图片描述

  • 将这个工程配置到Android      在这个工程目录下(cd ProjectName) cordova platform add android

    add2android

  • AndroidStudio 导入这个项目

    studio

    ps:我的androidStudio版本是2.1.2,第一次导入特别慢,我导入了20分钟,导入了之后一直卡在gradle加载界面。实际上并不需要,先导入项目,然后打开任务管理器关闭studio之后再重新导入项目,几乎瞬间就好了。

二、js调用android方法

  • 创建一个java类,继承CordovaPlugin。本例是js调用native中的speak方法
public class SpeechOFFSynthesize extends CordovaPlugin{
    public void speak(String content){
        Log.e("SpeechOFFSynthesize",content);
    }

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if("speak".equals(action)){
            //speechSynthesize
            String content = args.getString(0);
            speak(content);
            callbackContext.success("finish");//如果不调用success回调,则js中successCallback不会执行
            return true;
        }
        return false;
    }
}
  • 配置插件,在res/xml/config.xml下,value为包名+类名

    plugin

  • js调用
    html比较简单,就一个button,代码就不贴了。

<script>
    $("#button").click(function(){
         cordova.exec(success, fail, "SpeechOFFSynthesize", "speak", ["haha"]);
    });
    var success = function(message){
            alert("success = "+message);
         };
    var fail = function(message){
            alert("fail = "+message);
         };
</script>
  • 最后就是调用speak,打出日志了
    result

三、android调用js方法

js:

<script>
    <!-- android调用js方法 -->
    function showAlert(content){
        alert(content);
    }
</script>

android:

public class MainActivity extends CordovaActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml
        loadUrl(launchUrl);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(10000);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //不能在子线程中执行webview的方法
                            loadUrl("javascript:showAlert(\"你好\")");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}

由于需要等html完全加载完JS之后,Android的调用才能有效果,否则会没反应,所以我让它在子线程中等待了10秒然后在主线程中去调用js的方法。

四、CordOva加载外网

所有东西弄完了之后,导入到AndroidStudio里面,web文件是放在assets里面,能正常运行,可是放在外网里,却无法加载。
研究了一下发型是因为在CordovaLibs工程里,CordovaBridge文件中,有这样一段。

  else if (defaultValue != null && defaultValue.startsWith("gap_init:")) {
            // Protect against random iframes being able to talk through the bridge.
            // Trust only pages which the app would have been allowed to navigate to anyway.
            if (pluginManager.shouldAllowBridgeAccess(origin)) {
//                 Enable the bridge
                int bridgeMode = Integer.parseInt(defaultValue.substring(9));
                jsMessageQueue.setBridgeMode(bridgeMode);
                // Tell JS the bridge secret.
                int secret = generateBridgeSecret();
                return ""+secret;
            } else {
                Log.e(LOG_TAG, "gap_init called from restricted origin: " + origin);
            }
            return "";
        }

这里它限制了外网的加载,所以允许所有加载即可,代码如下:

 else if (defaultValue != null && defaultValue.startsWith("gap_init:")) {
            // Protect against random iframes being able to talk through the bridge.
            // Trust only pages which the app would have been allowed to navigate to anyway.
//            if (pluginManager.shouldAllowBridgeAccess(origin)) {
                // Enable the bridge
                int bridgeMode = Integer.parseInt(defaultValue.substring(9));
                jsMessageQueue.setBridgeMode(bridgeMode);
                // Tell JS the bridge secret.
                int secret = generateBridgeSecret();
                return ""+secret;
//            } else {
//                Log.e(LOG_TAG, "gap_init called from restricted origin: " + origin);
//            }
//            return "";

由于cordova的加载url是封装在CordovaLib下的ConfigXmlParser,为了防止修改url出现其他问题,所以我是用 EventBus,将url传过去的。

 private void setStartUrl(String src) {
        Pattern schemeRegex = Pattern.compile("^[a-z-]+://");
        Matcher matcher = schemeRegex.matcher(src);
        if (matcher.find()) {
            launchUrl = src;
        } else {
            if (src.charAt(0) == '/') {
                src = src.substring(1);
            }
            launchUrl=  EventBus.getDefault().getStickyEvent(String.class);
        }
Android代码-cordova调用安卓原生activity插件 cordova-plugins-activity cordova调用安卓原生activity插件 使用简介 JS端使用方式 //sendData表示要从js端发送到原生activity的数据,需用json对象传输 var sendData = { id:10001, name:"Simon", age:28 }; window.cordova.plugins.activity.start("com.zlzkj.vendor.MyActivity",sendData,function(data){ //回调函数中的data表示从原生activity传回来的数据,已处理为json对象 alert(data.id "::" data.name); }); 原生安卓activity接收参数和回传参数简单示例 public class MyActivity extends Activity { private Button btn; private int flag = 0; private Intent intent = null; 立即下载

相关推荐

cordova 和原生交互 调用h5页面

android集成cordova 并调用h5页面 有两个H5页面

android cordova交互,Cordova与原生交互--传值

cordova与原生的交互都是基于插件的形式提供(例如,获取设备信息、网络状态等)。依据项目业务就需要自定义插件1.使用plugman创建MiPlugin插件,并安装到项目中(会生成对应的模板文件 plugin.xml MiPlugin.js MiPlugin.java 等文件)1、安装plugmannpm install -g plugman2、创建插件plugman create --name...

weixin_42525387的博客 650

cordova js android

这份代码 覆盖了,cordova 和原生APP 交互 关键技术和代码。能从H5(JS)通过CORDOVA 到原生APP,处理完数据后结果返回给H5页面。 代码中提供cordova 源码。和android 原生关键技术代码。前提你得知道怎么引入。然后修改替换即可。

android cordova混合开发(交互部分)

最近公司需要混合开发一个app,先讲个基础需求,需求是这样的:js脚本调用本地的相机,拍照完成后,上传服务器然后再通知js,,OK,这就涉及到2个问题: 1.js调用android本地端method; 2.android本地端代码调用JS的function; 在讲cordova之前,我们先看看android源生的webView,也就是webKit是如何做到这个交互的: We

u010819959的专栏 1万+

cordova.js

集成corvoda webview到原生项目中时,参考http://rensanning.iteye.com/blog/2199866文章中提供的github地址中https://github.com/apache/cordova-android/releases下载的最新版zip包中使用test目录中的例子时运行成功后点击主页操作无反应,排查后还需放一个cordova.js在www目录下面才能打开主页面上其他操作,这个最重要的不知官方怎么没有放,浪费我等大好时间

cordova.js 用于移动端开发项目打包

Cordova 是用于使用HTML,CSS和JS构建移动应用的平台。我们可以认为Cordova是一个容器,用于将我们的网络应用程序与本机移动功能连接。

cordova与android通信_5:Cordova与原生交互--传值

参考:https://www.jianshu.com/p/4069d360b890相关命令1、安装plugmannpm install -g plugman2、创建插件plugman create --name DemoPlugin--plugin_id cordova-plugin-demo --plugin_version 1.0.0plugin.xmlDemoPlugin注意:clobbe...

weixin_30937427的博客 527

11 CO配置-控制-成本中心会计-定义分割结构(OKES-Define Splitting Structure)

业务背景:定义分割结构 事务码: OKES SPRO路径:SPRO->控制->成本中心会计->实际过账->期末结算->作业分配->划分->定义分割结构 第1步,SPRO路径进入 第2步,选择“新的条目”创建 分割结构 第3步,选择分割结构代码 点击“分割规则”进行下一个界面,点击“新条目”创建 分割结构规则 第4步,点击“为规则选择” 为分割结构规则创建版本并保存 第5步,选择“分配”,点击“新的条目” 输入分割结构分配

4371

Cordova系列之化繁为简:打造全场景适用的Cordova组件

一个基于Cordova封装的全场景组件,使用简单,在保留Cordova原有功能的基础上突破了必须继承CordovaActivity的限制。支持在Fragment中使用,还能能作为自定义view使用,提供关键节点的事件回调,可快速基于Cordova实现业务需求。

喻志强的博客 9576

Ubuntu声卡检测与故障排查:从基础命令到驱动修复

本文详细介绍了在Ubuntu系统中进行声卡检测与故障排查的完整流程。从使用lspci、aplay等基础命令识别硬件,到排查驱动冲突、修复权限问题,再到调整PulseAudio高级配置,提供了一套系统性的解决方案。文章结合实战案例,帮助用户快速诊断并解决Ubuntu系统常见的“无声”问题,恢复音频功能。

g2h3i4j5的博客 228

SAP后台JOB保姆级教程:从SM36创建到SM37监控,手把手教你搞定ABAP程序定时任务

本文详细解析SAP后台JOB从创建到监控的全流程,重点介绍SM36创建和SM37监控的操作步骤与最佳实践。通过真实案例演示如何配置定时任务、处理常见故障及实施企业级管理策略,帮助ABAP开发者高效管理后台程序执行。

weixin_30838873的博客 430

cordova Java交互_cordova3开发中java代码和js代码的交互

最近在用sencha touch 和cordova搭配做项目。项目中需要使用百度的android定位api来进行定位。这些部分是要使用java写的,于是就设计到了如何让sencha touch的js代码和java代码交互的问题。查阅资料后,发现一共有两种方法。综合其他人的方案和我的实际情况。决定梳理一下写个更清楚的方案出来。言归正传,第一种方式是采用Cordova plugin的方式。第二种是采用...

weixin_42298225的博客 415

西门子S7-200SMART控制步进电机(五)

前面详细讲述了运动控制向导的配置和运动控制指令的使用方法,接下来要讲的是简单程序的编写和调试。 在编写程序时,需要注意的是自定义的符号和地址不能与运动控制向导分配的存储器冲突。 一、软硬件组成 1、软件:STEP-7-Micro/WIN SMART软件; 2、硬件:西门子S7-200 SMART ST40 PLC、57步进电机和驱动器(DM542)。 二、手动控制步进电机旋转方向和速度 具体步骤...

qq_43134642的博客 2万+

cordova Java交互_Android 混合开发phonegap(Cordova)下,实现web开发中的Js和Java互相调用的功能...

1: 本机混合开发Phonegap的配置,如下:phonegap 版本: 6.4.6Cordova 版本: 6.5.0图片.png2: 创建项目命令:$ cordova create hello com.example.hello HelloWorld (后两个分拨是项目名称和包名)$ cd hello$ cordova platform add android --save图片.png生成的a...

weixin_32027887的博客 174

成本会计(第九版)王忠孝课后习题答案解析

在掌握了基础知识之后,我们还需要培养自己的实际操作能力。此外,在学习过程中,遇到困难时,要及时向老师、同学请教,不要害怕暴露自己的不足。三人行,必有我师,每个人都有值得学习的地方。首先,我们需要认真阅读教材,把基础知识掌握牢固。在这里,我建议大家使用《成本会计(第九版)》的配套练习册,这样可以帮助我们检查学习效果。同时,网上的一些优质课程和论坛也是不错的学习资源,例如网易云课堂、中国大学MOOC等。别担心,这里我给大家推荐一些实用的学习资料和方法,帮助你更好地掌握这门课程。出版社: 大连理工大学出版社。

weixin_58833001的博客 1888

如何用capl操控程控电源(RS232)

capl脚本操控RS232

xiaohuanxiong_的博客 3991

cordova打印机插件_phonegap/cordova plugin

蛋疼的是你不能用native去写app,那么只能用个中间件来完成,现在选择无疑是cordova,国内的多用appcan(去年用过,个人感觉除了有点乱之外其他的还ok),先来讲讲cordova插件,因为很多时候官方提供的plugin已经在我们自身应用中满足不了,那么只能依靠自己去完成,如下最简单的webapp plugin。plugin(myKitty)|__www||__myKitty.js...

weixin_32300981的博客 466

Python实战:5分钟搞定N-CMAPSS航空发动机数据集解析(附完整代码)

本文提供了一份针对N-CMAPSS航空发动机数据集的快速解析实战指南。通过Python的h5py库,详细演示了如何读取HDF5文件结构、理解数据分类(如传感器、健康参数、场景描述符)并加载为Pandas DataFrame。文章还澄清了数据集中常见的变量数量疑惑,并给出了从数据加载到构建剩余使用寿命预测模型预处理流水线的完整代码,帮助工程师和研究人员高效入门航空发动机预测性维护分析。

weixin_29057065的博客 422

android phonegap 插件开发,PhoneGap(Cordova)通过自定义plugin插件实现javascript与android交互-Go语言中文社区...

一.配置相关环境1,安装jdk jdk-7u79-windows-x64.exe (应该是64-Bit Server VM 版本,若不是需要调换否则eclipse启动不起来)配置环境变量2,安装node,node-v4.2.4-x64.msi3,安装cordova 。命令:npm install -g cordova@版本号(若是最新的话,就不需要加 @版本号)4,安装sdk。 installe...

weixin_31290873的博客 275

巧妙解决网页弹窗重复出现问题

本文探讨了网页弹窗关闭后刷新重现的问题及解决方案。通过分析原生JavaScript实现的弹窗代码存在的缺陷,提出了使用jQuery改进的方法。关键点包括:利用event.preventDefault()阻止默认行为避免刷新,采用jQuery的hide("slow")方法实现优雅的关闭动画,确保关闭状态持久化。改进后的方案既解决了弹窗重复出现的问题,又提升了用户体验,为网页弹窗交互提供了更优的实现方式。文中提供了完整的HTML、CSS和JavaScript代码示例,便于开发者直接应用。

2501_90323865的博客 181

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

cordova Java交互_Cordova插件中JavaScript代码与Java的交互细节介绍

在Cordova官网中有这么一张架构图:大家看右下角蓝色的矩形框"Custom Plugin"——自定义插件。意思就是如果您用Cordova打包Mobile应用时,发现您的移动应用里需要使用一些功能,这些功能用普通的JavaScript无法实现,而是需要调用移动平台的一些原生API才能实现时,我们就需要自己实现自定义插件。这些插件通过在特定的移动平台上采用原生开发实现,比如Android Stud...

weixin_36371906的博客 286

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

PhoneGap(Cordova)通过自定义plugin插件实现javascript与android交互

一.配置相关环境1,安装jdk jdk-7u79-windows-x64.exe (应该是64-Bit Server VM 版本,若不是需要调换否则eclipse启动不起来) 配置环境变量 2,安装node,node-v4.2.4-x64.msi 3,安装cordova 。命令:npm install -g cordova@版本号(若是最新的话,就不需要加 @版本号) 4,安装sdk。

IT小白的博客 3422

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: 给EventBus增加订阅收到消息提醒,用AndroidStudio重新打包成Jar文件
下一篇: 人声频率范围及各频段音色效果
Hoyn
博客等级 码龄17年 69粉丝 35原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值