2012-04-02 16 views
8

Przenoszę aplikację internetową do wersji Android. Po otrzymaniu i przetworzeniu danych JSON, na stronie znajduje się tablica obiektów JavaScript.Czy mogę przekazać obiekt JavaScript do przeglądarki Android WebView?

Jak mogę przekazać pełną zawartość jednego z obiektów javascript "out" do kontenera widoku internetowego do wyświetlania przy użyciu rodzimych elementów sterujących systemu Android?

Ostatecznie mógłbym stworzyć interfejs javascript z metodą posiadającą parametry dla każdej z możliwych właściwości obiektu javascript - ale wydaje się, że jest zbyt ciężki.

Czy ktoś może w tym pomóc?

+1

Sprawdź odpowiedzi w podobnym wątku http://stackoverflow.com/questions/2250917/passing-a-javascript-object-using-addjavascriptinterface-on-android/32698399#32698399 –

Odpowiedz

15

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.

+0

Dziękuję Jason, Z tego, co mówisz, nie można "po prostu" przekazać obiektu javascript bezpośrednio do funkcji ustawiającej java i oczekiwać, że zostanie ona przetłumaczona. Tak, aby wznowić, musiałbym: - wziąć mój obiekt JSON i przywrócić go z powrotem do json zakodowany ciąg - pass zakodowany ciąg kopii zapasowych za pośrednictwem interfejsu javascript - dekodować go do obiektu java Wszystko po to, aby uzyskać prawidłowy dostęp do danych. Dziękujemy za wyjaśnienie tego. – Simon

+0

Po próbie uzyskania tej odpowiedzi do pracy, dowiedziałem się, że interfejs javascript jest całkowicie uszkodzony w v2.3.x systemu Android. Wstyd. – Simon

+0

co jeśli chcę, aby moja funkcja Java była konstruktorem, więc zadzwoniłbym np. 'var ob = new Android.MyObject()', w jaki sposób zwrócę natywny obiekt javascript? – Michael

Powiązane problemy