web-dev-qa-db-fra.com

Passage d'un objet JavaScript à l'aide de addJavascriptInterface () sous Android

Est-il possible de passer un objet JavaScript de JavaScript à Java en utilisant addJavascriptInterface ()? Quelque chose dans ce sens:

var javaScriptObject = {"field1":"string1", "field2":"string2"};
JavaScriptInterface.passObject(javaScriptObject);

Comment un tel appel serait-il capturé du côté de Java? Je n'ai aucun problème à configurer l'interface pour envoyer une chaîne, mais lorsque j'envoie un objet, je reçois la valeur null du côté de Java.

29
pheelicks

Autant que je sache, addJavascriptInterface() ne fonctionne qu'avec les types primitifs et les chaînes, de sorte que vous ne pouvez pas transmettre d'objets Javascript arbitraires.

27
CommonsWare

J'ai trouvé une solution en utilisant JSON. Ma méthode Java renvoie un JSONArray, mon code javascript est reçu et converti en un vecteur javascript à l'aide de JSON.parse (). Voir l'exemple:

Java:

public class JavaScriptInterface {
Context mContext;
private static int ind=-1;
private static int [] val = { 25, 25, 50, 30, 40, 30, 30, 5, 9 };

public JavaScriptInterface(Context c) {
    mContext = c;
}

@JavascriptInterface
public JSONArray getChartData() {
    String texto = " [ {name: 'valor1', 2007: "+val[(++ind)%9]+"}, "+
                     " {name: 'valor2', 2007: "+val[(++ind)%9]+"}, "+
                     " {name: 'valor3', 2007: "+val[(++ind)%9]+"} ]"; 

    JSONArray jsonar=null;
    try {
        jsonar = new JSONArray(texto);
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return jsonar;
}
}

Maintenant le code javascript:

window.generateData = function() {
        /*var data = [ {name: 'valor1', 2007: 50},
                     {name: 'valor2', 2007: 20},
                     {name: 'valor3', 2007: 30} ];     */
        var data = JSON.parse( Android.getChartData() );
        return data;
    };

Le code commenté ci-dessus montre comment c'était à l'époque statique, et maintenant les données provenaient du code Java.

C'était testes sur Android 2.1 et 3.2.

9
Derzu

C'est comme ça que je vais ...

Dans Android ...

@JavascriptInterface
public void getJSONTData(String jsonData) {
      try {
             JSONObject data = new JSONObject(jsonData); //Convert from string to object, can also use JSONArray
          } catch (Exception ex) {}
}

En JavaScript ...

var obj = { Name : 'Tejasvi', Age: 100};
var str = JSON.stringify(obj);
Android.getJSONTData(str);

Pour l'instant, je ne pouvais trouver aucun autre moyen approprié de transmettre l'objet JavaScript natif directement à JavascriptInterface. 

L'appel de Android.getJSONTData({ Name : 'Tejasvi', Age: 100}) a pour résultat null (si le type de paramètre est Object) ou undefined (si le type de paramètre est défini comme String) dans getJSONTData.

8
Tejasvi Hegde

Vous ne pouvez pas transmettre JSONObject ou JSONArray, mais vous pouvez envoyer des chaînes avec ce formulaire et les analyser selon ces types. 

Vous avez le choix d’exposer la méthode à l’aide de chaînes, puis d’utiliser JSONObject ou JSONArray pour analyser la chaîne et l’utiliser en conséquence.

Voici ce que j'ai fait.

@JavascriptInterface
public void passJSON(String array, String jsonObj) throws JSONException
{
    JSONArray myArray = new JSONArray(array);
    JSONObject myObj = new JSONObject(jsonObj);     
    ...

}

où array est '["string1", "string2"] "et jsonObj est" {attr: 1, attr2: "monNom"}'

2
SergioM

Je pense que vous pouvez également transmettre JSONObject et JSONArray. Ainsi, non seulement les types primitifs, mais également les types primitifs stockés dans un tableau javascript [0,1,2] ou un dictionnaire {un: 1, deux: 2}.

Je n'ai pas vérifié cela dans le code, lisez simplement la documentation. Peut-être l'utiliser bientôt.

2
e mail

Je peux exécuter cette fonctionnalité

En Javascript:

var data = {
            'username' : $('#username').val().trim(),
            'password' : $('#password').val().trim(),
            'dns' : $('#dns').val().trim()
        }
        var str = JSON.stringify(data);
        Native.getLoginService(str);

Sous Android: 

@JavascriptInterface
public void getLoginService(String jsonData){
    try{
        JSONObject data = new JSONObject(jsonData);
        String username = data.getString("username");
        String password = data.getString("password");
        String dns = data.getString("dns");

        Log.i("TAG",username + " - " + password + " - " + dns);

    }catch (Exception ex){
        Log.i("TAG","error : " + ex);
    }
}

Bonne chance avec...

0
selçuk doğan