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
网友评论