一、问题描述:
在 Android 7.0 和使用腾讯 X5 浏览器内核的 **WebView **上,无法拉起支付宝。而在之前版本的 WebView 上不存在。
支付宝平台上有相关提问:
Android 7.0 的 WebView 无法调起支付宝
二、问题原因:
跳转支付宝一般打开一个支付宝提供的一个官方页面,
例如:
这时候 WebView 上会加载支付宝的下载页,并且刚才那个页面会加载一个唤醒支付宝的 **intent **协议。
例如:
处理 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;
}
网友评论