通过Android WebView从JavaScript调用Java函数

我想在我的Android应用程序中对一些Java代码进行同步调用。

我正在使用此解决scheme: https : //stackoverflow.com/a/3338656

我的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; } } 

我的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> 

当我点击java_callbutton,button进入按下状态。 我可以在控制台日志中看到'test' 。 一切都很正常,直到这里。

问题是,button不会回到正常状态。 它保持按下状态。 也许JavaScript的执行被破坏或者什么?

为什么button不会回到正常状态?

我不认为这是让JavaScript执行Java代码的最佳解决scheme。 看这里:

如果要将本机代码暴露给可通过JavaScript调用的HTML,请在Web视图声明中执行以下操作:

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

声明类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); } } 

我正在声明一个播放video的function,但是你可以做任何你想做的事情。

最后,通过简单的javascript调用,在WebView内容中调用它:

 <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> 

这个例子是从我的另一个答案,关于播放video,但应该足以解释。

编辑根据@ CedricSoubrie的评论:如果目标版本的应用程序设置为17或更高,你需要添加注释@JavascriptInterface上面的每个方法要导出到Web视图。

你的函数返回“true”。 这使得您的HTML代码的“onclick”属性等于true,因此button保持“单击”状态。