Android WebView
содержит метод, называемый addJavascriptInterface(Object obj, String interfaceName)
, который должен быть полезен здесь.
Используя этот метод, объект obj
, который вы добавляете в качестве интерфейса, можно получить через код JavaScript в веб-представлении. В вашем случае вы можете передать объект, который имеет метод setter, который переносит некоторый объект JavaScript обратно на Java.
Вам все равно необходимо создать код клея, который преобразует ваш объект JavaScript в объект JSON. Для быстрого подхода вы можете просто создать свой интерфейс для создания JSONObject на стороне Java, используя строку JSON, переданную из JavaScript. Класс JSONObject
в Java имеет конструктор, который принимает строку, содержащую данные JSON. Таким образом, вы можете передать строковый результат непосредственно обратно в Java и создать объект таким образом. Например:
class JSInterface {
HashMap<String, JSONObject> mObjectsFromJS = new HashMap<String, JSONObject>();
public void passObject(String name, String json) {
mObjectsFromJS.put(name, new JSONObject(json));
}
}
//At some point, register using:
mJSInterface = new JSInterface();
mWebView.addJavascriptInterface(mJSInterface, "Android");
Затем на стороне JavaScript, в обработчике, который имеет сгусток неанализируемого JSON в переменной jsonData:
Android.passObject("pageItems", jsonData);
Теперь, ваш JSInterface на стороне Java будет иметь JSONObject, содержащий элементы, к которым вы можете получить доступ, используя получатели, предоставленные JSONObject. Объекты, созданные с помощью вызова Javascript, будут отображаться на карте mObjectsFromJS
. Конечно, вы захотите добавить дополнительные вспомогательные методы в класс JSInterface, чтобы лучше управлять объектами.
Я не компилировал и не тестировал ни один из этих методов, поэтому вам может понадобиться немного настроить их для правильной работы. Но, надеюсь, это дает вам эту идею.
Однако, если объекты имеют согласованный интерфейс и элементы данных, было бы разумнее просто создать простую функцию JavaScript-клей, которая связывает свойства объекта JavaScript с полями на стороне Java, используя методы настройки.
ОБРАТИТЕ ВНИМАНИЕ Это дает возможность удаленного кода запускать собственный код на вашем устройстве. Если у вас нет полного контроля над страницами/сценариями, загружаемыми в WebView
, вы должны убедиться, что поведение, обнаруженное obj
, не допускает каких-либо эксплойтов.
Проверить ответы в аналогичной теме http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –