2012-12-08 11 views
21

Mam do czynienia z poważnym błędem systemu operacyjnego Android OS Jelly Bean 4.2, tutaj w moim programie używam JavaScript, aby uzyskać wysokość strony internetowej i działa idealnie z Android 2.2 do 4.1, ale kiedy próbował użyć tego samego kodu w Android 4.2, więc interfejs JavaScript nie działa.Interfejs JavaScript nie działa z Androidem 4.2

Jak mogę rozwiązać ten problem?

+1

Czy jesteś pewien, że sam interfejs javascript nie działa, a nie polecenie JavaScript (JS parse error) ? –

+0

Właściwie nazywam funkcji java-skrypt i jest wywoływana w poprzedniej wersji niż 17, ale nie działa na Android 4.2 api poziom 17 – Ravi

+0

Co funkcja javascript, który wywołuje za pomocą "loadUrl()", aby pobrać wysokość? –

Odpowiedz

46

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 kodu strony WWW (the metoda musi być również publiczna). 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.

Źródło: Android WebView Doc

+1

Bardzo dziękuję za te informacje: D Utknęliśmy, odkąd uaktualniliśmy nasze Wersja API aplikacji. – Ethenyl

+4

Holy crap! Nie mogę uwierzyć, jak długo też znajdę ten post. Powinien rzucić błąd lub COŚ, aby dać mi znać, co się dzieje! – Richard

+0

Podobno naprawia to lukę bezpieczeństwa we wcześniejszych wersjach Androida, jak to opisano tutaj - ale przykładowy kod ulega awarii w moich testach: http://stackoverflow.com/questions/6415882 – NoBugs

8

Zgodnie z dokumentem: Android doc Od wersji Androida 4.2 trzeba opatrzyć adnotację metodą @JavascriptInterface (a metoda musi być publiczna).

18

A jeśli używasz PROGUARD, należy pamiętać, aby dodać

-keepclassmembers class * { 
    @android.webkit.JavascriptInterface <methods>; 
} 

-keepattributes JavascriptInterface 
-keep public class com.mypackage.MyClass$MyJavaScriptInterface 
-keep public class * implements com.mypackage.MyClass$MyJavaScriptInterface 
-keepclassmembers class com.mypackage.MyClass$MyJavaScriptInterface { 
    <methods>; 
} 

Jeśli to nadal nie jest OK, dodaj

-keepattributes *Annotation* 

Uwaga: Twoja MyJavaScriptInterface musi być klasą publiczną

Ref #: Android Proguard Javascript Interface Fail

+0

W końcu to jest rozwiązanie. Nawet dodanie pierwszej części do proguard.cfg nie działa (Android 4.3 dla Galaxy Note 3), ale kluczem wydaje się być część "-keepattributes * Adnotacja *". Jak tylko dodałem to do cfg, zaczęło działać od razu. Wielkie dzięki :) – Sobakus

+0

O mój Boże, dziękuję. uratowałeś mnie od 11 godzin manipulowania moim kodem – hadi

5

Proguard config, który działa dla mnie z docelowym API 17+:

-keep @interface android.webkit.JavascriptInterface 
-keepclassmembers class * { 
    @android.webkit.JavascriptInterface <methods>; 
} 
Powiązane problemy