Ответ 1
AFAIK, addJavascriptInterface()
работает только с примитивными типами и строками, поэтому вы не можете передавать произвольные объекты Javascript.
Можно ли передать объект JavaScript из JavaScript в Java с помощью addJavascriptInterface()? Что-то в этом роде:
var javaScriptObject = {"field1":"string1", "field2":"string2"};
JavaScriptInterface.passObject(javaScriptObject);
Как бы такой вызов был захвачен на стороне Java? У меня нет проблем с настройкой интерфейса для отправки строки, но когда я отправляю объект, я получаю null на конец Java.
AFAIK, addJavascriptInterface()
работает только с примитивными типами и строками, поэтому вы не можете передавать произвольные объекты Javascript.
Я нашел решение, используя JSON. Мой метод Java возвращает JSONArray, в моем коде javascript я получаю это и конвертирую в вектор javascript, используя JSON.parse(). См. Пример:
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;
}
}
Теперь код 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] или словаре {one: 1, two: 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" } '
Я могу запустить эту функцию
В Javascript:
var data = {
'username' : $('#username').val().trim(),
'password' : $('#password').val().trim(),
'dns' : $('#dns').val().trim()
}
var str = JSON.stringify(data);
Native.getLoginService(str);
В 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);
}
}
Удачи с...