Passer un objet JavaScript en utilisant addJavascriptInterface () sur Android

Est-il possible de passer un objet JavaScript de JavaScript vers 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é sur le côté Java? Je n'ai aucun problème à configurer l'interface pour envoyer une chaîne, mais lorsque j'envoie un objet, je reçois null à la fin de Java.

AFAIK, addJavascriptInterface() ne fonctionne qu'avec des types primitifs et des chaînes, et vous ne pouvez pas passer des objets Javascript arbitraires.

J'ai trouvé une solution en utilisant JSON. Ma méthode Java renvoie un JSONArray, sur mon code javascript, je le reçois et je conviens à un javascript avec 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 il était lorsqu'il était statique, et maintenant les données proviennent du code Java.

Ce sont des tests sur Android 2.1 et 3.2.

C'est comme ça que je fais …

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); 

À partir de maintenant, je n'ai pas trouvé d'autre moyen approprié de transmettre l'objet JavaScript natif directement à JavascriptInterface.

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

Je pense que vous pouvez également passer JSONObject et JSONArray. Donc, non seulement les types primitifs, mais aussi 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, il suffit de lire les documents. Peut-être l'utiliser bientôt.

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

Votre option est d'exposer la méthode à l'aide de chaînes, puis vous pouvez 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: "myName"}'