Android's 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
, не допускает никаких эксплойтов.