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

使用PaddleOCR识别查验平台验证码

PaddleOCR识别国税查验平台验证码

m0_63932300的博客 1268

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

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

喻志强的博客 9576

LabVIEW QMH模板实战:从创建到错误处理的完整指南

本文提供LabVIEW QMH模板从创建到错误处理的完整实战指南。详细解析了队列消息处理器(QMH)作为LabVIEW核心设计模式如何实现任务解耦与异步通信,涵盖事件处理循环、消息处理循环的搭建、用户事件创建、队列引用管理、消息优先级控制以及健壮的错误处理机制,帮助开发者构建稳定、可维护的复杂应用程序。

white的博客 725

Android BluetoothSocket

BluetoothSocket是Android中用于在蓝牙设备之间进行数据传输的一种Socket。它提供了一种类似于TCP/IP协议的数据传输方式,可以在两个设备之间建立一个虚拟的通信管道,使得两个设备之间可以进行数据的传输和接收。BluetoothSocket可以用于客户端和服务端之间的通信,通过BluetoothSocket可以实现数据的双向传输。

liuning1985622的博客 1477

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

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

weixin_42298225的博客 415

VisionPro 9.0 QuickBuild里用C#脚本调用Halcon 23.11模型,保姆级图文配置流程

本文详细介绍了如何在VisionPro 9.0 QuickBuild环境中使用C#脚本调用Halcon 23.11深度学习模型,提供从环境配置到模型集成的保姆级图文教程。重点解决图像格式转换、许可证配置等工业视觉检测中的常见问题,帮助开发者快速实现高效、稳定的视觉检测流水线部署。

weixin_27027459的博客 432

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

告别CPU空转!用STC8的SPI+DMA高效驱动上百颗WS2812B灯珠

本文详细解析了如何利用STC8单片机的SPI+DMA外设高效驱动WS2812B全彩灯珠,解决传统软件延时驱动方式在长灯带应用中的性能瓶颈。通过硬件方案设计、数据格式转换和DMA传输配置,实现高达400Hz的刷新率和低于5%的CPU占用率,适用于大规模灯光项目。

weixin_30847939的博客 396

NVIDIA DGX Spark (Ubuntu 24.04) 部署Isaac Sim与Isaac Lab:二进制安装与ROS2集成实战

本文详细介绍了在NVIDIA DGX Spark工作站(Ubuntu 24.04系统)上,通过预编译二进制包稳定部署Isaac Sim与Isaac Lab的完整实战流程。文章重点剖析了二进制安装相较于源码编译和pip安装的优势,有效规避了CUDA、PyTorch等关键组件的版本冲突陷阱,并逐步指导完成环境配置、Isaac Lab集成、Conda环境管理以及ROS2 Jazzy的集成,最终构建出完整的机器人仿真与强化学习开发平台。

kite3的博客 396

cordova打印机插件_phonegap/cordova plugin

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

weixin_32300981的博客 466

yolov26改进 | 融合改进篇 | 基于 MobileNetV4 和双向特征金字塔网络BiFPN的融合改进(全网独家首发)

本文介绍BiFPN与MobileNetV4融合改进的YOLOv26。许多模块单独使用能够涨点,但直接叠加后可能因功能重复、通道不匹配、尺度冲突而掉点,因此融合前必须理解各模块作用。MobileNetV4利用UIB与Mobile MQA构建轻量主干,提升特征提取能力;BiFPN通过可学习权重完成双向多尺度融合,强化大、中、小目标的信息交互。两者优化Backbone与Neck,功能互补、结构冲突较少。本文提供代码、配置、消融对比及Codex修改思路,MobileNetV4也可替换其他主干,便于组合实验与二次创新

Snu77的博客 241

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

【产品】 产品设计:ID设计和MD设计详解

1、ID(Industry Design)工业设计 包含外观、材质、手感、颜色配搭,主要界面的实现与及色彩等方面的设计。 2、MD(Mechanical Design)结构设计 以手机为例: 前壳、后壳、手机的摄像镜头位置的选择、固定的方式、电池如何连接和手机的厚薄程度等。 如果是滑盖手机,如何让手机滑上去,怎样实现自动往上弹,SIM卡怎样插和拔的安排,这些都是手机结构设计的范畴。 繁...

产品线负责人 3万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

weixin_36371906的博客 286

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

上一篇: 给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、付费专栏及课程。

余额充值