我想在我的Android应用程序中对某些Java代码进行同步调用。
我的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按钮时,按钮进入按下状态。我可以'test'在控制台日志中看到。一切正常,直到这里。
java_call
'test'
问题是,按钮永远不会回到其正常状态。它保持在按下状态。也许JavaScript执行中断了还是什么?
为什么按钮从不返回其正常状态?
我认为这不是让JavaScript执行Java代码的最佳解决方案。看这里:
如果要将本机代码公开给HTML,以便可以通过javascript进行调用,请在网络视图声明周围执行以下操作:
JavaScriptInterface jsInterface = new JavaScriptInterface(this); webView.getSettings().setJavaScriptEnabled(true); webView.addJavascriptInterface(jsInterface, "JSInterface");
宣布课程JavaScriptInterface:
JavaScriptInterface
public class JavaScriptInterface { private Activity activity; public JavaScriptInterface(Activity activity) { this.activity = activity; } @JavascriptInterface public void startVideo(String videoAddress){ Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.parse(videoAddress), "video/3gpp"); activity.startActivity(intent); } }
我声明了一个用于播放视频的功能,但是您可以做任何您想做的事情。
最后,您可以WebView通过简单的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>
这个例子取自我的另一个关于播放视频的答案,但应该有足够的解释。
编辑 如果应用程序的目标版本设置为17或更高,则需要在@JavascriptInterface要导出到Web视图的每种方法上方添加注释。
@JavascriptInterface
这是关于如何实现的技巧:
将此客户端添加到你的WebView:
final class MyWebChromeClient extends WebChromeClient { @Override public boolean onJsAlert(WebView view, String url, String message, JsResult result) { Log.d("LogTag", message); result.confirm(); return true; } }
现在在你的javascript调用中执行以下操作:
webView.loadUrl("javascript:alert(functionThatReturnsSomething)");
现在在onJsAlert调用中,“ message”将包含返回的值。