2012-04-30 15 views
58

Desidero effettuare una chiamata sincrona ad un codice Java nella mia app per Android.Chiama la funzione Java da JavaScript tramite Android WebView

Sto usando questa soluzione: https://stackoverflow.com/a/3338656

mio codice Java:

final class MyWebChromeClient extends WebChromeClient { 
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) { 
      Log.d("LogTag", message); 
      result.confirm(); 
      return true; 
     } 
    } 

mio codice JavaScript:

<html> 
<script> 
function java_request(){ 
    alert('test'); 
} 
</script> 
<body> 
<h2>Welcome</h2> 
<div id="area"></div> 
<form> 
<input type="button" value="java_call" onclick="java_request()"> 
</form> 
</body> 
</html> 

Quando si tocca il tasto java_call, il pulsante va a lo stato premuto. Posso vedere 'test' nel log della console. Tutto è normale fino a qui.

Il problema è che il pulsante non torna mai allo stato normale. Rimane nello stato premuto. Forse l'esecuzione di JavaScript è rotta o qualcosa del genere?

Perché il pulsante non ritorna mai allo stato normale?

risposta

81

Non penso che questa sia la soluzione migliore per ottenere il javascript per eseguire il codice java. Vedi qui:

Se si desidera esporre codice nativo per il codice HTML per essere richiamabile tramite JavaScript, effettuare le seguenti operazioni intorno alla vostra vista web dichiarazione:

JavaScriptInterface jsInterface = new JavaScriptInterface(this); 
webView.getSettings().setJavaScriptEnabled(true); 
webView.addJavascriptInterface(jsInterface, "JSInterface"); 

dichiarare la classe JavaScriptInterface:

public class JavaScriptInterface { 
    private Activity activity; 

    public JavaScriptInterface(Activity activiy) { 
     this.activity = activiy; 
    } 

    public void startVideo(String videoAddress){ 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); 
     activity.startActivity(intent); 
    } 
} 

Sto dichiarando una singola funzione per la riproduzione di un video, ma puoi fare quello che vuoi.

Infine si chiama questo nei WebView contenuti tramite semplice chiamata javascript:

<video width="320" height="240" controls="controls" poster='poster.gif' 
     onclick="window.JSInterface.startVideo('file:///sdcard/test.3gp');" > 
    Your browser does not support the video tag. 
</video> 

L'esempio è preso da un'altra risposta di mio, di giocare i video, ma deve essere spiegando abbastanza.

EDIT Come da @ il commento di CedricSoubrie: se la versione di destinazione dell'applicazione è impostato su 17 o superiore è necessario aggiungere annotazioni @JavascriptInterface sopra ogni metodo che si desidera esportare alla visualizzazione web.

+1

grazie per informazioni, ho visto questa soluzione. poiché c'è un bug in 2.3.X per questa soluzione, non voglio usarlo. soluzione era molto formidabile. – ozkolonur

+0

@ozkolonur Ho usato questo con tutte le versioni di Android 2.2+, mai visto alcun bug. Puoi condividere quello che è. Un link è anche molto gradito. –

+0

http://code.google.com/p/android/issues/detail?id=12987 – ozkolonur

1

La funzione restituisce 'true'. Ciò rende la proprietà 'onclick' del tuo codice HTML uguale a true, quindi il pulsante rimane 'cliccato'.