H5调用Android原生Api
16lz
2021-12-04
Android 与H5交互之跳转拦截
- Android拦截跳转,实现web调用原生Api
- 定义变量
- 在Android代码设置回调事件
- 前端代码
- 判断url是否合法
- 根据不同的type执行不同的操作
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 blockwebview.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页面的介绍.
更多相关文章
- [Android]解决EditText设置成密码模式改变提示字体的问题
- Google I/O Android官方新体系架构之:Lifecycle
- android selector 背景选择器的使用, button (未点击,点击,选中保持
- Android调用WCF
- Android(安卓)Studio 单刷《第一行代码》系列 07 —— Broadcast
- Android(安卓)Studio 单刷《第一行代码》系列 06 —— Fragment
- Android(安卓)Studio 单刷《第一行代码》系列 01 —— 第一战 He
- Android(安卓)Studio 单刷《第一行代码》系列 05 —— Fragment
- Android(安卓)Studio 单刷《第一行代码》系列 04 —— Activity