通过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_call
button,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保持“单击”状态。