Cordova中JavaScript/TypeScript调用原生代码

Cordova官网上没有说怎么使用JS调用本地代码,但是告诉了我们如何写一个插件。
Cordova插件的根本原理就是JS和原生代码的交互。
所以抠出Cordova插件中调用本地代码的部分就可以了。



Ionic2创建插件简易教程:


适用于:
Cordova中JavaScript调用Android原生代码
Ionic中      TypeScript调用Android原生代码
IOS已经验证,同样原理,可以使用。

开发环境版本号:
cordova  6.5.0
Ionic        2.2.1
node       6.10.1
npm        3.10.10

一、写原生代码类
cordova项目或者Ionic项目编译后,会产生对应平台下的源码。

使用cordova/Ionic命令编译为android平台下的项目,使用 AndroidStudio 打开android源码(platforms\android目录下 ),创建一个类,类的要求:
1.    继承 CordovaPlugin类
2.    重写 execute( String  action,  JSONArray  args,  CallbackContext  callbackContext)方法:
          execute方法中 根据传来的action参数进行匹配,做对应的业务处理,有对应的action返回true,找不到对应的action返回false。
业务处理成功调用 callbackContext.success(此方法会调用JavaScript/TypeScript中 cordova.exec中传入的'成功回调方法' ),
业务处理失败调用 callbackContext.error (此方法会调用 JavaScript/TypeScript cordova.exec中传入的'失败回调方法' )

示例:
package com.test.hello.myplugin;

import android.content.Context;
import android.content.SharedPreferences;

import org.apache.cordova.CallbackContext;
import org.apache.cordova.CordovaPlugin;
import org.json.JSONArray;
import org.json.JSONException;


public  class Test  extends CordovaPlugin {

     @Override
     public  boolean execute( String action,  JSONArray args,  CallbackContext callbackContext)  throws  JSONException {
         if (action.equals( "testAction")) {
             String message = args.getString( 0);
             this.myMethod(message, callbackContext);
             return  true;
        }
         return  false;
    }

     private  void myMethod( String message,  CallbackContext callbackContext) {
         if (message !=  null && message.length() >  0) {

           SharedPreferences sp = cordova.getActivity().getSharedPreferences( "config"Context.MODE_PRIVATE);
           String ss = sp.getString( "test", "SharedPreferences的数据");
            callbackContext.success(ss);
        }  else {
            callbackContext.error( "Expected one non-empty string argument.");
        }
    }
}


二、配置config.xml文件
config.xml文件在res/xml目录下

   <feature  name= "Test" >
     <param  name= "android-package"  value= "com.test.hello.myplugin.Test"  />
   </feature>

name= "Test"    为JS或TS代码中 cordova.exec传入的'服务参数'
value= "com.test.hello.myplugin.Test"    为第一步中创建的类的完整类名

三、调用原生代码

cordova.exec(< successFunction>, < failFunction>, < service>, < action >, [< args >]);
参数说明:
successFunction        成功回调        
failFunction                 失败回调             
service                         服务名字
action                           action
args                              要传给原生代码的所有参数(以数组形式传递)

在JavaScript中调用本地代码示例:
   
    cordova.exec( function(msg){
          alert( ' test 成功了' + msg)
        },  function(msg){
          alert( ' test 失败了')
        },  "Test"" testAction ", [ '传递的参数']);
    }
  

在TypeScript中直接调用cordova.exec 会报错, 需要声明cordova为any类型,在import语句后添加
declare  let cordova: any;

四、编译运行--------- 重点

此时如果使用cordova/Ionic命令运行项目的话,无法正常调用原生代码。
因为使用cordova/Ionic编译命令,会重新生成config.xml文件,之前的配置过的config.xml的feature 会丢失。
此时需要再次使用 AndroidStudio打开android源码再配置一遍 config.xml文件:
   <feature  name= "Test" >
     <param  name= "android-package"  value= "com.test.hello.myplugin.Test"  />
   </feature>
配置完后,使用 AndroidStudio编译运行app(不能使用cordova/Ionic命令编译运行)



五、 重点----为了解决 config.xml文件被覆盖问题,在第二步中不再编辑config.xml文件,
而是编辑\platforms\android目录下的android.json文件,
config_munge 节点下添加如下片段:
{
    "xml": "<feature name=\"Test\"><param name=\"android-package\" value=\"com.test.hello.myplugin.Test\" /></feature>",
    "count": 1
}
这样配置后,就不必使用AndroidStudio编译运行了,直接使用cordova/Ionic命令编译运行即可。
示例:
"config_munge": {
    "files": {
        "res/xml/config.xml": {
            "parents": {
                "/*": [
                    {
                        "xml": "<feature name=\"SplashScreen\"><param name=\"android-package\" value=\"org.apache.cordova.splashscreen.SplashScreen\" /><param name=\"onload\" value=\"true\" /></feature>",
                        "count": 1
                    },
                    {
                        "xml": "<feature name=\"StatusBar\"><param name=\"android-package\" value=\"org.apache.cordova.statusbar.StatusBar\" /><param name=\"onload\" value=\"true\" /></feature>",
                        "count": 1
                    },
                    {
                        "xml": "<feature name=\"Whitelist\"><param name=\"android-package\" value=\"org.apache.cordova.whitelist.WhitelistPlugin\" /><param name=\"onload\" value=\"true\" /></feature>",
                        "count": 1
                    },
                    {
                        "xml": "<feature name=\"Test\"><param name=\"android-package\" value=\"com.test.hello.myplugin.Test\" /></feature>",
                        "count": 1
                    }
                ]
            }
        }
    }
}






Ionic2简易创建插件教程:
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值