2016-04-27 11 views
0

Ich kann nicht herausfinden, wie man einen Wert zurück von einem Cordova-Plugin zurück auf die JavaScript-Bereich der App bekommen. Ich kann Werte einfach an das Plugin senden. Ich benutze Phonegap Build. Hier ist der Code:beim Aufruf einer Plugin-Methode von Phonegap App, Daten von nativen Android-Funktion zurückgegeben ist immer außerhalb des Geltungsbereichs (undefined)

das Plugin-javascript:

var exec = require('cordova/exec'); 

module.exports = { 

getSomething: function(successCallback) { exec(successCallback, 
null, "PluginName", "getSomething", []); } }; 

das Plugin-java:

import blah blah blah; 

public class PluginName extends CordovaPlugin { public PluginName(){ } 

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

    if(action.equals("getSomething")) 
    {  this.getSomething(callbackContext); } } else { return false; } 
    return true; } 



    public void getSomething(CallbackContext callbackGetVol) { AndroidClass ac = 
    (AndroidClass) 
    this.cordova.getActivity().getSystemService(Context.SOME_SERVICE); 

    int data_needed = ac.androidGetMethod(parameters); 

    callbackGetVol.success(data_needed); callbackGetVol.error("error"); } 

der JavaScript-App:

Dies funktioniert gut:

PluginName.getSomething(function(data_needed) {Log("data = " + data_needed);}); 

Aber hier app_variable ist immer „undefined“:

var app_variable; 
PluginName.getSomething(function(data_needed) {app_variable = data_needed;}); 

Ich möchte in der App Javascript verwenden data_needed, aber es ist nur innerhalb der Grenzen des Callback-Körper definiert.

Ich habe versucht, eine Funktion übergeben, die in den Anwendungsbereich der App ist (und Variationen dieser):

var foo = function() { 
      var local_variable = 0; 
      return { 
       bar: function() { 
        PluginName.getSomething(function(local_variable){ 
        return local_variable;}); 
       } 
      }; 
     }(); 
     app_variable = foo.bar(); 

Aber „app_variable“ ist immer „undefined“. Was mache ich falsch?

+0

Ich bin überrascht; Sie verwenden nicht die Funktion sendPluginResult ([Daten von Java zu Js]) auf Ihrem var callbackGetVol in getSomething (anstelle von Erfolg ([Daten von Java zu JS])); aber es sendet die Daten zurück, die zu deinem Javascript benötigt werden, also ist es nicht dein Problem, richtig? Sie möchten den von Java zurückgesendeten Inhalt innerhalb einer globalen Variablen in Javascript umwandeln? – nyluje

+0

@apdobaj Sie haben mehrere Missverständnisse darüber, wie Cordova/Phonegap funktioniert. Wenn Sie das Java betrachten, tun Sie das Falsche. - Diese FAQ sollte auch helfen. Lies zuerst die fettgedruckten Sätze. [Top Mistakes von Entwicklern neu in Cordova/Phonegap] (https://github.com/jessemonroy650/top-phonegap-mistakes/blob/master/new-to-Phonegap.md) – JesseMonroy650

+0

@ nyluje, habe ich versucht, die sendPluginResult zu verwenden wie: PluginResult dataResult = neues PluginResult (PluginResult.Status.OK, vol); dataResult.setKeepCallback (true); callbackGetVol.sendPluginResult (Datenergebnis); aber die Ergebnisse sind die gleichen. Das Phonegap-Build-Tool schien das Keyword "statisch" nicht zu mögen.Jesse, ich erkenne vollkommen, dass ich keine Best Practices verwende, aber ich versuche nur ein funktionierendes Proto mit dem Verständnis zu bekommen, dass es von jemandem neu geschrieben wird, der wirklich weiß, was sie tun. Es gibt eine Menge Infos in diesem Blog, von denen ich schon viel gesehen habe. – apdobaj

Antwort

0

Versuchen Sie, mit so etwas wie dies auf Ihre Java-Seite:

public class MyPlugin extends CordovaPlugin { 
    private static CallbackContext listenerCallbackContext; 

public boolean execute(String action, final JSONArray args, final CallbackContext callbackContext) throws JSONException { 
    Log.i(APP_TAG,"execute("+action+","+args+","+callbackContext+") starts"); 
if(action.equals("getSomething")) 
{  
     this.bindListener(callbackContext); 
} else { return false; } 
} 

private boolean bindListener(final CallbackContext callbackContext){ 
    Log.i(APP_TAG,"listener(callbackContext) starts"); 
    cordova.getThreadPool().execute(new Runnable() { 
     public void run(){ 
      try{ 
       listenerCallbackContext = callbackContext; 
       /////////////////////////////////// 
       //// FOR THE DEMO sendToJS() should be triggered when you get your result from JAVA 
       ////////////////////////////////////// 
       MyPlugin.sendToJS(); 
       //////////////////////////// 
       /////////////////// 
       /////////////////////// 
      }catch(Exception e){e.printStackTrace();} 
     } 
    }); 
    return true; 
} 

public static void sendToJS(){ 
    Log.i(APP_TAG, "sendToJS() starts"); 
    JSONObject eventData = new JSONObject(); 
    try { 
     eventData.put("EVENT_DATA", "event_data"); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, eventData); 
    pluginResult.setKeepCallback(true); 
    try{ 
      listenerCallbackContext.sendPluginResult(pluginResult); 
    } catch(NullPointerException e){ 
     e.printStackTrace(); 
    } 
    Log.i(APP_TAG, "sendQrCodeToJS() stops"); 

} 
} 
0

ich die Dinge neu arrangiert ein bisschen (geleitet, um die Daten, die ich in der App js verfügbar machen möchten), aber das ist für mich nicht funktioniert hat.

Im .java- Plugin:

private boolean bindListener(final CallbackContext callbackContext, final int event_data){ 
    Log.i("xyz-plugin","listener(callbackContext) starts"); 
    cordova.getThreadPool().execute(new Runnable() { 
     public void run(){ 
      try{ 
       CallbackContext listenerCallbackContext = callbackContext; 
       /////////////////////////////////// 
       //// FOR THE DEMO sendToJS() should be triggered when you get your result from JAVA 
       ////////////////////////////////////// 
       PluginName.sendToJS(listenerCallbackContext, event_data); 
       //////////////////////////// 
       /////////////////// 
       /////////////////////// 
      }catch(Exception e){e.printStackTrace();} 
     } 
    }); 
    return true; 
} 

public static void sendToJS(CallbackContext listenerCallbackContext, int event_data){ 
    Log.i("xyz-plugin", "sendToJS() starts"); 
    PluginResult pluginResult = new PluginResult(PluginResult.Status.OK, event_data); 
    pluginResult.setKeepCallback(true); 
    try{ 
      listenerCallbackContext.sendPluginResult(pluginResult); 
    } catch(NullPointerException e){ 
     e.printStackTrace(); 
    } 
    Log.i("xyz-plugin", "sendQrCodeToJS() stops"); 
} 

public void getSomething(CallbackContext callbackContext) { 

    int event_data = androidNativeFunction(); 
    this.bindListener(callbackContext, event_data);  
} 

und dann in der js App:

event_data = 0; 
window.getSomething(function(event_data) {}); 
Log.d("event_data = " + event_data); //always zero 

Gedanken?

+0

Log.d ("event_data =" + event_data); sollte innerhalb sein, function (event_data) {}. Ich kann nicht mehr sagen, es fehlen Log-Informationen, die die Ursache des Problems erklären könnten. Lassen Sie Ihr Projekt auf einem GitHub fallen, wenn Sie möchten, dass ich es mir anschaue (vielleicht kann ich es ausführen, wenn es mit cordova 4.0.0 (Android API 19) kompiliert wurde). – nyluje

+0

Sie haben Recht, nyluje. Nachdem ich mich diesem Prinzip unterworfen hatte, bekam ich, was ich brauchte, danke für die Hilfe. – apdobaj

+0

Freut mich zu hören, dass es funktioniert hat. Könnte ich eine Stimme bekommen, da meine Tipps richtig waren;) Sie sollten auch Ihre Antwort mit dem richtigen Endcode für beide Seiten bearbeiten (java + js), es sieht jetzt etwas verwirrend aus, da "event_data" als Eingabe und Ausgabe verwendet wird. – nyluje