Android 与H5交互之跳转拦截
Android拦截跳转,实现web调用原生Api
定义变量
private final String pre = "android://";//约定url格式
private final String TYPE1 = "TYPE1";
private final String TYPE2 = "TYPE2";
private final String TYPE3 = "TYPE3";
在Android代码设置回调事件
// An highlighted block
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//在此回调中,我们可以获得webView中的跳转地址.
//return true 表示我们消费掉此次回调
Log.e(url);//我们可以在此处打印日志查看是否有拦截带url地址
if(isAndroidLink(url,pre)){//判断是否为我们所约定的跳转
//可通过url获取参数
//列:
//该url是android方法的请求,通过解析url中的参数来执行相应方法
if (url.length() > pre.length()) {//判断url长度大于约定长度时才做进一步判断,防止Java数组越界异常
//截取10位以后的字符串
String json = url.substring(pre.length(), url.length());
//因为我们传入时base64加密过,所以需要使用base64解密,获得正确的json格式参数
String s = new String(Base64.decode(json.getBytes(), Base64.DEFAULT));
try {
//获取json字符串中type值
String type = new JSONObject(s).getString("type");
//获取data
JSONObject data = new JSONObject(s).getJSONObject("data");
//对比字符串是否为指定类型,根据不同的type执行不同的操作
executionByType(type,data);
} catch (JSONException e) {
e.printStackTrace();
}
}
return true;
...//执行你的代码逻辑.
}
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
前端代码
注:以下是在前端web页面中的代码
function toAndroid(type) {//此处type内容可以自定义
var host = "android://";//host可以自定义,相当于与原生做一个协议
var content =
"{" +
"\"type\":"+type+"," +
"\"data\":{" +
"\"string1\":"+type+"}" +
"\"string2\":"+type+"}" +
"\"string3\":"+type+"}" +
"\"string4\":"+type+"}" +
"}";//可在此设置你的传参
content = window.btoa(content);//此为js代码,base64转义可防止内容乱码以及简单的加密
window.location.href = host + content;//执行本地跳转
}
判断url是否合法
private boolean isAndroidLink(String url,String contract){
if (url.contains(contract)) {
return ture;
} else {
return false;
}
}
根据不同的type执行不同的操作
private void executionByType(String type,JSONObject obj){
Object 你的参数 = obj.get("你的参数");
switch (type) {
case TYPE1:
//执行TYPE1相对应的操作
break;
case TYPE2:
//...
break;
case TYPE3:
//...
break;
}
}
至此,我们就可以通过web的点击或者某一些触发条件,来调用我们手机端的Api来做一下事情.暂时只说到web调用原生,下回给大家带来原生回调给web页面的介绍.