H5调用Android原生Api

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 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页面的介绍.

你可能感兴趣的:(Android开发,原生与H5交互,Android,WebView交互)