美文网首页
2.3JS端调用Android端代码

2.3JS端调用Android端代码

作者: 琳媚儿 | 来源:发表于2019-11-07 20:29 被阅读0次

通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

image
Android通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调分别拦截JS对话框 (即上述三个方法),得到他们的消息内容

prompt()可以返回任意类型的值,操作最全面方便、更加灵活;而alert()对话框没有返回值;confirm()对话框只能返回两种状态(确定 / 取消)两个值

实例:

pTest.html:

<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<button onclick="clickprompt()">prompt输入框</button>
<script>
    function clickprompt(){
        var result=prompt("js://demo?arg1=111&arg2=222");
        alert("demo"+result);
    }
    function returnResult(result){
        alert("result is"+result);
    }
</script>
</body>
</html>

通过制定参数协议,不管是url还是message,到native拦截处理。native调用Js只有一种方式,就是使用loadUrl(js),为在Web 端定义好的javascript 函数

       webView = findViewById(R.id.prompt);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webView.loadUrl("file:///android_asset/pTest.html");
        webView.setWebChromeClient(new WebChromeClient() {
          @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                // 拦截输入框(原理同方式2)
                // 参数message:代表promt()的内容(不是url)
                // 参数result:代表输入框的返回值
                Uri uri = Uri.parse(message);   //假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)
                if (uri.getScheme().equals("js")) {
                    if (uri.getAuthority().equals("demo")) {
                        System.out.println("js调用了android 的方法");
                        Set<String> connection = uri.getQueryParameterNames();
                        Iterator<String> iterable = connection.iterator();
                        while (iterable.hasNext()) {
                            String next = iterable.next();
                            String value = uri.getQueryParameter(next);
                            System.out.println("key" + next + "value" + value);
                        }
                        result.confirm("js调用了Android的方法成功了");
                    }
                    return true;
                }
                return super.onJsPrompt(view, url, message, defaultValue, result);

            }
        });

通过alert()和confirm()拦截的原理相同,此处不作过多讲述,拦截JS的警告框

     @Override
     public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
        return super.onJsAlert(view, url, message, result);
     }
// 拦截JS的确认框
     @Override
     public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
         return super.onJsConfirm(view, url, message, result);
     }
23b6b0b44b90cb69079d4988e3b37df.jpg image

总结:

image

相关文章

网友评论

      本文标题:2.3JS端调用Android端代码

      本文链接:https://www.haomeiwen.com/subject/thqbbctx.html