Android 7.0 无法拉起支付宝App

2017-04-01  本文已影响5040人  枫叶丶鑫鑫

一、问题描述:

Android 7.0 和使用腾讯 X5 浏览器内核的 **WebView **上,无法拉起支付宝。而在之前版本的 WebView 上不存在。
支付宝平台上有相关提问:
Android 7.0 的 WebView 无法调起支付宝

二、问题原因:

跳转支付宝一般打开一个支付宝提供的一个官方页面,
例如:

https://ds.alipay.com/?scheme=alipays%3A%2F%2Fplatformapi%2Fstartapp%3FappId%3D20000193%26url%3D%252Fwww%252FsetNewAccount.htm%253FsubBizType%253DWATER%2526sourceId%253D%2526adcode%253D%2526city%253D%2526instId%253D&cf=1001&session=GSJP0CZDHI299GV6XBMEO748&num=13758782424&nonce=s14zZK3pQse3IJ9m&encpn=78bd6cc427b3925c182bffb4d1b124a0

这时候 WebView 上会加载支付宝的下载页,并且刚才那个页面会加载一个唤醒支付宝的 **intent **协议。
例如:

intent://platformapi/startapp?appId=20000013&pwdType=ordinaryPassword&_t=1456301771669#Intent;scheme=alipays;package=com.eg.android.AlipayGphone;end

处理 intent 协议可以参考我之前的一个文章:
Android WebView中跳转第三方App

而目前的 Android 7.0 上的系统 WebView 内核和腾讯的 X5 浏览器内核不能发出 intent 协议。导致不能唤醒支付宝!其他使用 intent 协议唤醒第三方App的都会出现这种情况!

三、解决方案:

在我们打开支付宝提供的官方页面时, URL 中包含了 Scheme 参数,所以我们可以通过截取 Scheme 参数利用 Scheme 协议唤醒支付宝。

示例代码:

public static boolean skipScheme(Context context, String newurl){
        if(TextUtils.isEmpty(newurl) || !newurl.contains("scheme")){
            return false;
        }
        MyLogUtil.LogI("yxx","skipScheme处理自定义scheme-->" + newurl);
        DealedUrl dealedUrl = dealUrl(newurl);
        final String finalParams = dealedUrl.params;
        if(TextUtils.isEmpty(finalParams))return false;
        TreeMap<String, String> treeMap = getMapFromString(finalParams);
        if(!treeMap.containsKey("scheme"))return false;
        String schemeUrl = treeMap.get("scheme");
        try {
            schemeUrl = URLDecoder.decode(schemeUrl,"utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        try {
            // 以下固定写法
            final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(schemeUrl));
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            List<ResolveInfo> resolves = context.getPackageManager().queryIntentActivities(intent,0);
            if(resolves.size()>0){
                ((Activity)context).startActivityIfNeeded(intent, -1);
            }
        } catch (Exception e) {
            // 防止没有安装的情况
            e.printStackTrace();
            return false;
        }
        return true;
    }

相关工具代码:

public static class DealedUrl {
        public String url;
        public String params;
 }

public static DealedUrl dealUrl(String url) {
        DealedUrl dealedUrl = new DealedUrl();
        if (!url.contains("?")) {
            dealedUrl.url = url;
            dealedUrl.params = "";
            return dealedUrl;
        }
        String params = url.substring(url.indexOf("?") + 1);
        dealedUrl.url = url.substring(0, url.indexOf("?"));
        String[] results = params.split("&");
        StringBuilder specialParams = new StringBuilder();//该url特有参数
        for (String str : results) {
            if (str.split("=").length != 2) {
                continue;
            }
            String key = str.split("=")[0];
            specialParams.append(str).append("&");
        }
        if (specialParams.length() > 0) {
            specialParams.deleteCharAt(specialParams.length() - 1);
        }
        dealedUrl.params = specialParams.toString();
        return dealedUrl;
    }

public static TreeMap<String, String> getMapFromString(String data) {
        TreeMap<String, String> reqMap = new TreeMap<>();
        if (TextUtils.isEmpty(data)) {
            return reqMap;
        }
        String[] array = data.split("&");
        for (String entry : array) {
            String[] parts = entry.split("=");
            if (parts.length < 2) {
                continue;
            }
            reqMap.put(parts[0], parts[1]);
        }
        return reqMap;
    }
上一篇下一篇

猜你喜欢

热点阅读