2012-12-25 14 views
32

Mam widok internetowy z dodanym interfejsem javascript, który działa doskonale na większości urządzeń, z wyjątkiem tych z systemem Android 4.2.1.Android 4.2.1, Przerwy interfejsu WebView i interfejsu javascript

usunąłem większość kodu, i pozostał z kodem bardzo prosty:

this.webView.getSettings().setJavaScriptEnabled(true); 
this.webView.setWebChromeClient(new WebChromeClient()); 
this.webView.addJavascriptInterface(new Object() { 
    public void handshake() { 
     Log.d("JS", "handshake no params"); 
    } 

    public void handshake(String json) { 
     Log.d("JS", "handshake with params: " + json); 
    } 
}, "Android"); 

W javascript stronie rzeczy kod testowania wygląda następująco:

Android.handshake(); 

Ale mam to w LogCat:

E/Web Console: Uncaught TypeError: Object [object Object] has no method 'handshake'

Znowu to samo dokładne działa dobrze w urządzeniach, które są HAV e starsza wersja Androida (< 4.2.1), którą przetestowałem (minimalna wersja to 2.3.3).

Dziwne jest to, że gdy rozpoczynam całkowicie nowy projekt, z samym tylko działaniem, które ma tylko WebView, z tym samym kodem, wszystko działa dobrze nawet dla 4.2.1, ale kiedy jest częścią mojego aktualnego projekt, rzeczy się psują. Nie ma nic, co robię ze stroną internetową, która nie jest zawarta w podanych fragmentach kodu.

Najbardziej dziwne jest to, że javascript znajduje obiekt Androida, ale po prostu nie ma żądanej metody (handshake), jak to możliwe?

Każda pomoc zostanie bardzo doceniona, ponieważ doprowadza mnie to do szału przez ostatnie 2 tygodnie (jest to błąd, do którego wracam cały czas, potem się poddaje, itp.). Dzięki.

Odpowiedz

95

Z Android 4.2 dokumentacji:

Uwaga: Jeśli po ustawieniu targetSdkVersion do 17 lub wyższej, należy dodać adnotację @JavascriptInterface do dowolnej metody, które mają być dostępne kodzie strony WWW (metoda musi również być publiczne). Jeśli nie dostarczysz adnotacji, ta metoda nie będzie dostępna na Twojej stronie internetowej podczas uruchamiania Androida w wersji 4.2 lub nowszej.

+0

Plus, musisz ustawić minSdkVersion> = 17, czyli 4.2, Jelly Bean MR1. Chyba że zrobi dokładnie to, co opisał @ Nitzan-Tomer. Przyczyną tego zachowania są problemy z bezpieczeństwem Androida. –

4

Musisz zanotować (@JavascriptInterface) metody w klasie Java, które chcesz udostępnić JavaScript.

public class JavaScriptInterface { 
Context context; 


JavaScriptInterface(Context c) { 
    context = c; 
} 

@JavascriptInterface 
public void edit(String postid) { 
    Log.d("myApp", "EDIT!"); 
    //do stuff 
} } 

To działało dla mnie. Wypróbuj to.

+0

Powinieneś wyjąć pierwszy "@JavascriptInterface", ponieważ zgłasza błąd w Android Studio, który nie ma zastosowania do konstruktora. –

+0

Dziękuję @AlexanderBolinsky – Raghu

Powiązane problemy