Android WebView
zawiera metodę o nazwie addJavascriptInterface(Object obj, String interfaceName)
, która powinna być przydatna tutaj.
Za pomocą tej metody do obiektu obj
dodanego jako interfejs można uzyskać dostęp za pośrednictwem kodu JavaScript w widoku sieci Web. W twoim przypadku możesz przekazać obiekt, który ma metodę ustawiającą, która przenosi jakiś obiekt JavaScript z powrotem do Javy.
Nadal musisz utworzyć kod kleju, który konwertuje obiekt JavaScript do obiektu JSON. Aby uzyskać szybkie podejście, wystarczy, że interfejs wygeneruje obiekt JSONObject po stronie Java, używając łańcucha JSON przekazanego z JavaScript. Klasa JSONObject
w Javie ma konstruktor, który akceptuje ciąg zawierający dane JSON. Tak więc możesz przekazać uszeregowany wynik bezpośrednio do Javy i utworzyć obiekt w ten sposób. Na przykład:
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");
następnie na stronie JavaScript, w przewodnika, który ma kropelka nieanalizowanego JSON w zmiennej jsonData:
Android.passObject("pageItems", jsonData);
Teraz swoje JSInterface na stronie Java będzie miał JSONObject zawierający elementy, do których można uzyskać dostęp za pomocą modułów pobierających dostarczonych przez JSONObject. Obiekty utworzone przez wywołanie Javascript będą znajdować się na mapie mObjectsFromJS
. Będziesz oczywiście chciał dodać dodatkowe metody pomocnicze do klasy JSInterface, aby umożliwić lepsze zarządzanie obiektami.
Nie skompilowałem ani nie przetestowałem żadnej z tych metod, więc może być konieczne ich poprawienie w celu poprawnego działania. Ale mam nadzieję, że to daje ci pomysł.
Jeśli jednak obiekty mają spójny interfejs i elementy danych, rozsądniej byłoby po prostu utworzyć prostą funkcję kleju JavaScript, która wiąże właściwości obiektu JavaScript z polami obiektów po stronie Java za pomocą metod ustawiających.
PROSZĘ ZAUWAŻYĆ Umożliwia to zdalne kodowanie kodu macierzystego urządzenia. Jeśli nie masz pełnej kontroli nad stronami/skryptami ładowanymi do WebView
, upewnij się, że zachowanie ujawnione przez obj
nie zezwala na żadne exploity.
Sprawdź odpowiedzi w podobnym wątku http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –