一尘不染

通过Android WebView从JavaScript调用Java函数

javascript

我想在我的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'在控制台日志中看到。一切正常,直到这里。

问题是,按钮永远不会回到其正常状态。它保持在按下状态。也许JavaScript执行中断了还是什么?

为什么按钮从不返回其正常状态?


阅读 313

收藏
2020-05-01

共2个答案

一尘不染

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

如果要将本机代码公开给HTML,以便可以通过javascript进行调用,请在网络视图声明周围执行以下操作:

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

宣布课程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调用在内容中调用此代码:

<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视图的每种方法上方添加注释。

2020-05-01
一尘不染

这是关于如何实现的技巧:

将此客户端添加到你的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”将包含返回的值。

2020-05-04