通过Android WebView从JavaScript调用Java函数

ozk*_*nur 71 javascript android android-webview

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

我正在使用此解决方案: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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的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>
Run Code Online (Sandbox Code Playgroud)

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

问题是,按钮永远不会恢复到正常状态.它保持在按下状态.也许JavaScript执行被破坏了什么?

为什么按钮永远不会恢复正常状态?

Bor*_*jev 101

我认为这不是让javascript执行java代码的最佳解决方案.看这里:

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

JavaScriptInterface jsInterface = new JavaScriptInterface(this);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(jsInterface, "JSInterface");
Run Code Online (Sandbox Code Playgroud)

声明类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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我宣布播放视频的单一功能,但你可以做任何你想做的事情.

最后你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>
Run Code Online (Sandbox Code Playgroud)

这个例子取自我的另一个答案,关于播放视频,但应该足够解释.

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

  • @Maarten:实际上这不是我答案中唯一的错误.我现在纠正了. (2认同)
  • @BorisStrandjev非常明确的答案!请注意,您必须将"@JavascriptInterface"注释添加到您希望从JavaScript版本17或更高版本中获得的任何方法.资料来源:http://developer.android.com/guide/webapps/webview.html (2认同)