android莫名其妙打开支付宝,Android 7.0 无法拉起支付宝App

一、问题描述:

在 Android 7.0 和使用腾讯 X5 浏览器内核的 **WebView **上,无法拉起支付宝。而在之前版本的 WebView 上不存在。

支付宝平台上有相关提问:

Android 7.0 的 WebView 无法调起支付宝

二、问题原因:

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

例如:

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

例如:

而目前的 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 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 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 getMapFromString(String data) {

TreeMap 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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值