Cordova官网上没有说怎么使用JS调用本地代码,但是告诉了我们如何写一个插件。 Cordova插件的根本原理就是JS和原生代码的交互。 所以抠出Cordova插件中调用本地代码的部分就可以了。
Ionic2创建插件简易教程: http://www.cnblogs.com/eccainiao/p/6398072.html
适用于:
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简易创建插件教程: http://www.cnblogs.com/eccainiao/p/6398072.html