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

2.2JS端调用Android端代码

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

2.2通过WebViewClient的shouldOverrideUrlLoading()方法回调拦截url

具体原理:

1.Android通过 WebViewClient 的回调方法shouldOverrideUrlLoading ()拦截 url
2.解析该 url 的协议
3.如果检测到是预先约定好的协议,就调用相应方法

步骤1:在JS约定所需要的Url协议

以.html格式放到src/main/assets文件夹里

UrlTest.html

<html>
<head>
    <meta charset="UTF-8">
</head>
<body>
<button onclick="callAndroid()">点击调用Android代码</button>
<script>
    function callAndroid(){
        document.location = "js://webview?arg1=111&arg2=222";
    }
    function returnResult(result){
        alert("result is"+result);
    }
    </script>
</body>
</html>

步骤2:在Android通过WebViewClient复写shouldOverrideUrlLoading ()
UrlTestActivity.java:

       webView = findViewById(R.id.Url);
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);//设置与JS交互权限
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        webView.loadUrl("file:///android_asset/Url.html");//加载JS代码
        //重写WebViewClient类的shouldOverrideUrlLoading方法
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 步骤2:根据协议的参数,判断是否是所需要的url
                // 一般根据scheme(协议格式) & authority(协议名)判断(前两个参数)
                //假定传入进来的 url = "js://webview?arg1=111&arg2=222"(同时也是约定好的需要拦截的)
                Uri uri = Uri.parse(url);
                if (uri.getScheme().equals("js")) {// 如果url的协议 = 预先约定的 js 协议
                    if (uri.getAuthority().equals("webview")) {
                        // 如果 authority  = 预先约定协议里的 webview,即代表都符合约定的协议
                        // 所以拦截url,下面JS开始调用Android需要的方法
                        Toast.makeText(Url.this, "js通过拦截调用了Android的方法", Toast.LENGTH_SHORT).show();
                        System.out.println("js调用了Android的方法");
                        // 可以在协议上带有参数并传递到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);
                        }
                        //得到Android 方法的返回值
                        webView.loadUrl("javascript:returnResult(" + result + ")");
                    }
                    return true;
                }
                return super.shouldOverrideUrlLoading(view, url);
            }
        });
image

相关文章

网友评论

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

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