2012-12-25 10 views
32

Ho una visualizzazione Web con interfaccia javascript aggiunta che funziona perfettamente sulla maggior parte dei dispositivi, ad eccezione di quelli con Android 4.2.1.Android 4.2.1, WebView e interruzioni di interfaccia javascript

ho rimosso la maggior parte del codice, e rimase con un codice molto semplice:

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"); 

Nel lato javascript delle cose del codice di test è simile al seguente:

Android.handshake(); 

ma ottengo questo nel logcat:

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

Ancora una volta, questa stessa cosa esatta funziona bene nei dispositivi che hanno e vecchio sistema operativo Android (< 4.2.1) che ho testato (la versione minima è 2.3.3).

La cosa strana è che se avvio un progetto completamente nuovo, con nient'altro che una singola attività che ha solo una WebView, con lo stesso codice, tutto funziona bene anche per 4.2.1, ma quando fa parte del mio effettivo progetto, le cose si rompono. Non c'è nulla che io stia facendo con la webview che non è inclusa in questo frammento di codice che ho fornito.

Qual è il più strano per me è che la javascript trovi l'oggetto Android ma non ha il metodo richiesto (handshake), come può essere?

Qualsiasi aiuto sarà molto apprezzato poiché questo mi ha fatto impazzire per le ultime 2 settimane o giù di lì (è un bug che torno a sempre, poi mi arrendo, ecc.). Grazie.

risposta

95

Dal Android 4.2 documentazione:

Attenzione: Se hai impostato il tuo targetSdkVersion a 17 o superiore, è necessario aggiungere l'annotazione @JavascriptInterface a qualsiasi metodo che si desidera a disposizione il vostro codice della pagina web (il metodo deve anche essere pubblico). Se non si fornisce l'annotazione, il metodo non sarà accessibile dalla pagina Web durante l'esecuzione su Android 4.2 o versioni successive.

+0

Inoltre, è necessario impostare minSdkVersion> = 17, che è 4.2, Jelly bean MR1. A meno che non faccia esattamente quello che ha descritto @ Nitzan-Tomer. Il motivo di questo comportamento è a causa di problemi di sicurezza di Android. –

4

È necessario annotare i metodi (@JavascriptInterface) nella classe Java che si desidera rendere disponibile per JavaScript.

public class JavaScriptInterface { 
Context context; 


JavaScriptInterface(Context c) { 
    context = c; 
} 

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

Ha funzionato per me. Prova questo.

+0

Dovresti eliminare il primo '@JavascriptInterface' in quanto genera un errore in Android Studio che non è applicabile al costruttore. –

+0

Grazie @AlexanderBolinsky – Raghu

Problemi correlati