美文网首页
Android 7.0 无法拉起支付宝App

Android 7.0 无法拉起支付宝App

作者: 枫叶丶鑫鑫 | 来源:发表于2017-04-01 10:49 被阅读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;
        }
    

    相关文章

      网友评论

          本文标题:Android 7.0 无法拉起支付宝App

          本文链接:https://www.haomeiwen.com/subject/rcqiottx.html