Android Cordova将参数传递给本机错误

Android Cordova将参数传递给本机错误,android,cordova,cordova-plugins,Android,Cordova,Cordova Plugins,我对执行Cordova自定义插件和向其传递参数有一些问题。 我正在使用函数cordova.exec(callback、errCallback、pluginName、pluginAction、pluginArgs),如下所示: module BlankCordovaApp2 { "use strict"; export module Application { export function initialize() { document.addEventListener

我对执行Cordova自定义插件和向其传递参数有一些问题。 我正在使用函数cordova.exec(callback、errCallback、pluginName、pluginAction、pluginArgs),如下所示:

module BlankCordovaApp2 {
"use strict";

export module Application {
    export function initialize() {
        document.addEventListener('deviceready', onDeviceReady, false);
    }

    function onDeviceReady() {
        document.addEventListener('pause', onPause, false);
        document.addEventListener('resume', onResume, false);
        var r = Math.floor((Math.random() * 1000) + 1);
        log({ id: r, value: "test" + r },
            function () { alert('pass') },
            function () { alert('fail') });
    }

    function log (log, callback, errCallback) {
        cordova.exec(callback,
            errCallback,
            "LogstashLogger",
            "LOGGER_SERVICE_ACTION_LOG",
            log
            );
    };

    function onPause() {
        // TODO: This application has been suspended. Save application state here.
    }

    function onResume() {
        // TODO: This application has been reactivated. Restore application state here.
    }

}

window.onload = function () {
    Application.initialize();
}
}
这样,cordova就调用了我的插件: 公共布尔执行(字符串操作、字符串rawArgs、CallbackContext CallbackContext) 这很好

不过,我还想将string和jsonarray传递给我的插件。不幸的是,无论我传递给cordova.exec的是什么,都会调用executefor(…,String rawArgs…),因此:

  • cordova.exec(…,“test”)调用执行时使用“test”作为rawArgs,但使用双引号!到底是什么

  • cordova.exec(…,[{id:1,value:“test1”},{id:1,value:“test1”}]调用执行时将[{id:891,value:“test891”},{id:891,value:“test891”}]作为字符串执行

调用我的函数日志(…)似乎是在进行一些奇怪的类型转换。但我只能使用字符串[]作为类型直接调用cordova.exec,但当我调用cordova.exec(…,[“test”])时它应该使用一个字符串元素调用execute with jsonarray作为参数,但它实际上使用字符串参数调用execute with value[“test”]


所以问题是,如何正确调用cordova.exec?

尝试以下方法:

Javascript

var json1 = {foo: "bar"};
var json2 = {bar: "foo"};

cordova.exec(
    successCallback,
    errorCallback,
    'MyPlugin',
    'myAction',
    [json1,json2]
);
Java

public class MyPlugin extends CordovaPlugin {

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {

        if ("myAction".equals(action)){
            JSONObject json1 = args.getJSONObject(0);
            JSONObject json2 = args.getJSONObject(1);
            callbackContext.success();
        }
        return true;
    }
}
更新


下面是一个工作示例项目,它演示了如何在Android平台上将JSON从Javascript传递到Java:

Hello Dave,谢谢,但这正是我的问题。调用您的方法时,将使用字符串作为参数而不是JSONArray调用execute。此字符串的传递值为:[“{”foo\:“bar\”,“{”bar\:“foo\”]。我正在使用cordova tools for visual studio 2015 community。您好,再次抱歉我的错误,您不需要再对输入JSON进行字符串化,因为cordova现在为您执行此操作。我已相应地更新了我的答案。我不知道我的VS有什么问题:)我无法在我的项目中使用您的插件,因为名称空间cordova.plugins不可见-即使在构建项目之后。。。如果我试图通过将代码复制到index.js来运行您的src/www/plugin.js中的代码,我也无法构建项目,因为[json1,json2]无法转换为字符串[]。看起来我的cordova版本缺少一些cordova.exec构造函数。。。还是不知道怎么了。我已经删除了VS中的所有内容,再次安装了VS2013,并使用Apache Cordova 3.1的工具,而且始终会调用execute,并使用字符串作为参数,无论我在js的Cordova.exec中使用了什么参数。