2011-11-17 1 views
5

Ho sviluppato un plug-in Android PhoneGap. Il plug-in viene richiamato con successo, ma il callback non viene richiamato. Non ho idea di dove mi sia perso qualcosa.Plugin Android PhoneGap: callback di successo e fallimento non viene chiamato

Qualcuno ha idea di cosa potrebbe essere sbagliato quando la richiamata non viene richiamata?

seguito è il mio codice:

JS Contenuto del file: file di

var SharedPreferencePlugin = function() {}; 

SharedPreferencePlugin.prototype.getvalues = function(content, success, fail) { 
    return PhoneGap.exec( 
     function(args) { 
      console.log("success called from plugin's js file");  
     }, 
     function(args) { 
      console.log("failure called from plugin's js file"); 
     }, 
     'SharedPreferencePlugin', 
     'getvalues', 
     [content] 
    ); 
}; 

SharedPreferencePlugin.prototype.update = function(itemName, success, fail) { 
    return PhoneGap.exec( 
     function(args) { 
      console.log("success called from plugin's js file");  
     }, 
     function(args) { 
      console.log("failure called from plugin's js file"); 
     }, 
     'SharedPreferencePlugin', 
     'update', 
     [itemName] 
    ); 
}; 

PhoneGap.addConstructor(function() { 
    PhoneGap.addPlugin('SharedPreferencePlugin', new SharedPreferencePlugin()); 
}); 

Java:

public class SharedPreferencePlugin extends Plugin{ 

    public static final String GET_ACTION = "getvalues"; 
    public static final String UPDATE_ACTION = "update"; 
    static Context staticContext = MainActivity.staticContext; 
    SharedPreferences dataStorage = staticContext.getSharedPreferences(MainActivity.PREFS_NAME, 0); 

    public PluginResult execute(String action, JSONArray data, String callbackId) 
    { 
     Log.d("SharedPreferencePlugin", "Plugin Called with action: " + action); 
     PluginResult result = null; 
     if(action.equals(GET_ACTION)) 
     { 
      Log.d("SharedPrferencePlugin", "inside if for 'getvalues'"); 
      JSONArray savedData = getPreferences(); 
      Log.d("SharedPreferencePlugin", "Data: " + savedData); 
      result = new PluginResult(Status.OK, savedData); 
     } 
     else if(action.equals(UPDATE_ACTION)) 
     { 
      try 
      { 
       updateSharedPreferences(data.getJSONObject(0).getString("itemName")); 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.put("status", "success"); 

       result = new PluginResult(PluginResult.Status.OK, jsonObject); 
      } 
      catch(JSONException ex) 
      { 
       Log.d("SharedPreferencePlugin", "Got JSONException: " + ex.getMessage()); 
       result = new PluginResult(PluginResult.Status.JSON_EXCEPTION); 
      } 
     } 
     else 
     { 
      result = new PluginResult(PluginResult.Status.JSON_EXCEPTION); 
      Log.d("SharedPreferencePlugin", "Invalid action: " + action + " obtained."); 
     } 
     return result; 
    } 

    public void updateSharedPreferences(String itemName) 
    { 
     Log.d("SharedPreferencePlugin", "Inside updateSharedPreferences, value passed: " + itemName); 
     SharedPreferences tmpPreferenceReference = staticContext.getSharedPreferences(MainActivity.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = tmpPreferenceReference.edit(); 

     if(itemName.equals(tmpPreferenceReference.getString(MainActivity.NAME_ITEM1, ""))) 
     { 
      Integer tmpInt = Integer.parseInt(tmpPreferenceReference.getString(MainActivity.QUANTITY_ITEM1, "0")) - 1; 
      editor.putString(MainActivity.QUANTITY_ITEM1, tmpInt.toString()); 
     } 
     editor.commit(); 
    } 

    protected JSONArray getPreferences() 
    { 
     ArrayList<String> arrItemNames = new ArrayList<String>(); 
     ArrayList<String> arrItemQuantities = new ArrayList<String>(); 

     arrItemNames.add(0, dataStorage.getString(MainActivity.NAME_ITEM1, "")); 
     arrItemNames.add(1, dataStorage.getString(MainActivity.NAME_ITEM2, "")); 
     arrItemQuantities.add(0, dataStorage.getString(MainActivity.QUANTITY_ITEM1, "")); 
     arrItemQuantities.add(0, dataStorage.getString(MainActivity.QUANTITY_ITEM2, "")); 

     //------------------------------------------------------------------- 
     ArrayList<ArrayList> tempArrayList = new ArrayList<ArrayList>(); 
     tempArrayList.add(arrItemNames); 
     tempArrayList.add(arrItemQuantities); 

     JSONArray jsonData = new JSONArray(tempArrayList); 
     //------------------------------------------------------------------- 

     return jsonData; 
    } 
} 

codice HTML per lanciare il plugin:

function test() 
      { 
       console.log("Test called"); 
       window.plugins.SharedPreferencePlugin.getvalues({}, 
        function() { // Success function 
         console.log("success called"); 
        }, 
        function() { // Failure function 
         console.log('Share failed'); 
        } 
       ); 
      } 

Qualsiasi aiuto è molto apprezzato

Grazie.

risposta

1

Grazie ragazzi per le vostre risposte.

Poiché il problema non è stato risolto, ho ricreato un nuovo progetto di prova e sono andato passo dopo passo per garantire che ogni piccolo pezzo di codice funzioni correttamente e lentamente si sia spostato sull'obiettivo desiderato per il plug-in.

Finalmente ho funzionato con il nuovo progetto che ho creato e scritto di nuovo il plug-in.

Grazie.

+0

Solo per aggiungere informazioni: il tuo problema era che invece di chiamare il successo o il fallimento nella chiamata PhoneGap.exec, stavi solo collegandoti alla console – scooterman

1

Quando dici che è sicuramente in esecuzione il codice nativo, come lo sai? Stai vedendo il Log.d o stai effettivamente inserendo un punto di interruzione e passando attraverso e vedendo se il risultato del ritorno; linea viene eseguita?

Inoltre, quale versione di PhoneGap usi?

+0

Ho aggiornato il codice a PhoneGap 1.2. Sì, ho inserito 'Log.d' come puoi vedere nel codice, e sono in grado di vedere l'output. Tuttavia, 'console.log' come nelle callback non viene stampato. Qualche idea? –

+1

Solo un pensiero, su quale dispositivo stai testando questo? Mi è capitato di sapere che non tutti i dispositivi console.log sono effettivamente presenti nel logcat (ad es. HTC Desire HD). Prova a cambiarli in avvisi e vedere se si presentano. –

1

Se si sta utilizzando PhoneGap 1.2 è necessario rimuovere la riga:

PluginManager.addService("SharedPreferencePlugin","com.devapps.mmvspinningwheel.SharedPreferencePlugin"); 

in quanto non è richiesto. Inoltre, dovresti probabilmente spostare PhoneGap.addConstructor() nella parte inferiore del tuo file .js.

Dean non è sbagliato in quanto alcuni dispositivi come l'HTC che console.log non funziona correttamente, e quale versione di Android stai testando?

+0

Ciao Simon, ho aggiornato il mio codice JS. Hai ragione, 'PluginManager' stava dando errori con PhoneGap 1.2. Ho aggiunto il codice HTML alla domanda. e l'output di 'console.log' è visto in Logcat. Sto testando su Samsung Galaxy Tab 10.1 (versione Android 3.1). Grazie. –