Передача объекта JavaScript с помощью addJavascriptInterface () на Android

Можно ли передать объект JavaScript из JavaScript в Java с помощью addJavascriptInterface ()? Что-то в этом роде:

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

Как бы такой вызов был захвачен на стороне Java? У меня нет проблем с настройкой интерфейса для отправки строки, но когда я отправляю объект, я получаю null на конец Java.

Solutions Collecting From Web of "Передача объекта JavaScript с помощью addJavascriptInterface () на Android"

addJavascriptInterface() , addJavascriptInterface() работает только с примитивными типами и строками, поэтому вы не можете передавать произвольные объекты Javascript.

Я нашел решение, используя JSON. Мой метод Java возвращает JSONArray, в моем javascript-коде я получаю это и конвертирую в вектор javascript, используя JSON.parse (). См. Пример:

Ява:

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

Теперь код 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; }; 

Прокомментированный выше код показывает, как это было, когда статично, и теперь данные поступают из кода Java.

Это были тесты на Android 2.1 и 3.2.

Вот как я это делаю …

В 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) {} } 

В JavaScript …

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

На данный момент я не нашел другого подходящего способа передать собственный JavaScript-объект непосредственно на JavascriptInterface.

Вызов Android.getJSONTData({ Name : 'Tejasvi', Age: 100}) приводит к null (если тип параметра – Object ) или undefined (если тип параметра определен как String ) в getJSONTData .

Я думаю, вы также можете передавать JSONObject и JSONArray. Таким образом, не только примитивные типы, но и примитивные типы, хранящиеся в массиве javascript [0,1,2] или словаре {один: 1, два: 2}.

Я НЕ проверил это в коде, просто прочитал документы. Возможно, это будет скоро.

Вы не можете передавать JSONObject или JSONArray, но вы можете отправлять строки с этой формой и анализировать их для этих типов.

Ваш вариант заключается в том, чтобы разоблачить метод с помощью строк, а затем вы можете использовать JSONObject или JSONArray для синтаксического анализа строки и использования ее соответствующим образом.

Вот что я сделал.

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

Где array is ["string1", "string2"] 'и jsonObj is' {attr: 1, attr2: "myName"} '