Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Я нашел решение, используя 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.

Ответ 3

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

В 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.

Ответ 4

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

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

Ответ 5

Вы не можете передавать 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" } '

Ответ 6

Я могу запустить эту функцию

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

Удачи с...