Обратный вызов из Activity on Cordova

У меня есть действие под названием «Подпись», и я вызываю его из CordovaPlugin;

Плагин.java

public boolean execute(String action, JSONArray args,
            CallbackContext callbackContext) throws JSONException
    {
    Intent i = new Intent(context, Signature.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    cordova.startActivityForResult(this,i,90);
}
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        Log.d(TAG, "activity result in plugin: requestCode(" + requestCode + "), resultCode(" + resultCode + ")");
        if(requestCode == 90) {
             if (resultCode == this.cordova.getActivity().RESULT_OK) {
                 Bundle res = intent.getExtras();
                 String result = res.getString("results");
                 Log.d("FIRST", "result:"+result);
                 this.callbackContext
                 .success(result.toString());
             } else {
                 this.callbackContext.error("Error");
             }
     }

Подпись.java

private void finishWithResult(String result,int status)
{
    Bundle conData = new Bundle();
    conData.putString("results", result);
    Intent intent = new Intent();
    intent.putExtras(conData);
    setResult(status, intent);
    finish();
}

Однако, когда я вызываю функцию «cordova.startActivityForResult», функция «onActivityResult» немедленно вызывает ее сама. Я не могу выполнить обратный вызов из Activity через finishWithResult. Любые советы. Спасибо


person engincancan    schedule 17.03.2015    source источник


Ответы (1)


Прежде всего, отсутствовал некоторый код (инструкция возврата для метода execute), и вы должны сказать android/cordova-plugin подождать, пока результат не будет отправлен обратно в ваше веб-приложение с помощью NO_RESULT и setKeepCallback для PluginResult, иначе Cordova/Android ожидает получить результат, как только метод выполнить завершится :

Плагин.java:

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

    PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
    r.setKeepCallback(true);
    callbackContext.sendPluginResult(r);

    Intent i = new Intent(context, Signature.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    cordova.startActivityForResult(this,i,90);

    return true;

}

public void onActivityResult(int requestCode, int resultCode, Intent intent){
    // here is your former code
    ...
    ...
    // at last call sendPluginResult 
    this.callbackContext.sendPluginResult(new PluginResult(PluginResult.Status.OK, result.toString()));

    // when there is no direct result form your execute-method use sendPluginResult because most plugins I saw and made recently (Reminder) prefer sendPluginResult to success/error
    // this.callbackContext.success(result.toString());
}

Пример здесь( для вашего класса подключаемого модуля) и здесь(для вашего класса подписи).

И один из моих: здесь и здесь.

person Blauharley    schedule 17.03.2015