2012-04-30 23 views
58

Quiero hacer una llamada síncrona a algún código Java en mi aplicación de Android.Llamar a la función Java desde JavaScript sobre Android WebView

estoy usando esta solución: https://stackoverflow.com/a/3338656

Mi código 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; 
     } 
    } 

Mi código 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> 

Al tocar el botón java_call, el botón va a el estado presionado. Puedo ver 'test' en el registro de la consola. Todo es normal hasta aquí.

El problema es que el botón nunca vuelve a su estado normal. Permanece en estado comprimido. Tal vez la ejecución de JavaScript se ha roto o algo así?

¿Por qué el botón nunca vuelve a su estado normal?

Respuesta

81

No creo que esta sea la mejor solución para obtener el javascript para ejecutar código java. Ver aquí:

Si desea exponer código nativo para el código HTML para ser exigible a través de JavaScript, haga lo siguiente alrededor de su Web declaración:

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

declarar la clase 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); 
    } 
} 

Estoy declarando una sola función para reproducir un video, pero puede hacer lo que quiera.

Por último se llama a este en los contenidos a través de WebView simple llamada 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> 

El ejemplo está tomado de otra respuesta de la mina, sobre la reproducción de vídeos, pero debe ser lo suficientemente explicando.

EDITAR De acuerdo con el comentario de @ CedricSoubrie: si la versión de destino de la aplicación se establece en 17 o más es necesario agregar anotación @JavascriptInterface encima de cada método que desea exportar a la vista web.

+1

gracias por la información, vi esta solución. ya que hay un error en 2.3.X para esta solución, no quiero usarlo. La solución fue muy buena. – ozkolonur

+0

@ozkolonur He estado usando esto con todas las versiones de Android 2.2+, nunca vi ningún error. ¿Puedes compartir lo que es? Un enlace también es muy bienvenido. –

+0

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

1

Su función devuelve 'verdadero'. Eso hace que la propiedad 'onclick' de su código HTML sea verdadera, por lo tanto, el botón permanece 'hecho clic'.

Cuestiones relacionadas