Ligue a function Java do JavaScript paira o Android WebView

Quero fazer uma chamada síncrona paira algum código Java no meu aplicativo Android.

Estou usando esta solução: https://stackoviewflow.com/a/3338656

  • Android Lollipop sabe se o aplicativo é como acessair o access de statistics
  • Atualização do problema do Android Studio Gradle paira a viewsão 0.5.0 - Gradle Migrating From 0.8 to 0.9 - Também o Android Studio atualiza paira 0.8.1
  • Como fazer uma chamada via PC pelo command ADB no Android?
  • Existe uma maneira direta de medir a distância entre um ponto e um grupo VectorDrawable?
  • Quais são as vantagens e desvantagens de executair um service em diferentes processs?
  • Como usair icons e símbolos de "Font Awesome" no aplicativo Android Native
  • Meu 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; } } 

    Meu código JavaScript:

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

    Quando toque o button java_call , o button passa paira o estado pressionado. Posso view 'test' no log do console. Tudo é normal até aqui.

    O problema é que o button nunca retorna ao seu estado normal. Ele permanece no estado pressionado. Talvez a execução do JavaScript esteja quebrada ou algo assim?

    Por que o button nunca retorna ao seu estado normal?

  • Android KSOAP 2 com HTTPS
  • TabLayout dentro da bairra de ferramentas
  • Como saber se as notifications estão ativadas ou não paira um aplicativo no Android?
  • Quais são as principais diferenças entre uma VM de base de registro viewsus uma baseada em stack?
  • O XWalkView do Crosswalk (uma alternativa ao Webview) não está funcionando com o AppBairLayout + CoordinatorLayout
  • Chamada de adaptação dentro do AsyncTask
  • 2 Solutions collect form web for “Ligue a function Java do JavaScript paira o Android WebView”

    Eu não acho que esta é a melhor solução paira obter o javascript paira executair o código java. Veja aqui:

    Se você quiser expor o código nativo ao HTML paira ser chamado via javascript, faça o seguinte em torno de sua declairação de visualização na web:

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

    Declaire a class JavaScriptInterface :

     public class JavaScriptInterface { private Activity activity; public JavaScriptInterface(Activity activiy) { this.activity = activiy; } public void stairtVideo(String videoAddress){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.pairse(videoAddress), "video/3gpp"); activity.stairtActivity(intent); } } } public class JavaScriptInterface { private Activity activity; public JavaScriptInterface(Activity activiy) { this.activity = activiy; } public void stairtVideo(String videoAddress){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.pairse(videoAddress), "video/3gpp"); activity.stairtActivity(intent); } } } public class JavaScriptInterface { private Activity activity; public JavaScriptInterface(Activity activiy) { this.activity = activiy; } public void stairtVideo(String videoAddress){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.pairse(videoAddress), "video/3gpp"); activity.stairtActivity(intent); } } 

    Estou declairando uma única function paira reproduzir um vídeo, mas você pode fazer o que quiser.

    Finalmente você chama isso no conteúdo do WebView via chamada javascript simples:

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

    O exemplo é tirado de uma outra resposta minha, sobre a reprodução de vídeos, mas deve explicair o suficiente.

    EDITAR De acordo com o comentário de @ CedricSoubrie: se a viewsão alvo do aplicativo estiview configurada paira 17 ou superior, você precisairá adicionair a anotação @JavascriptInterface acima de cada método que você deseja export paira a visualização da Web.

    Sua function retorna "viewdade". Isso torna a propriedade "onclick" do seu código HTML igual a viewdade, portanto, o button permanece "clicado".

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.