一、問題描述:
在 Android 7.0 和使用騰訊 X5 瀏覽器內(nèi)核的 **WebView **上垮兑,無法拉起支付寶族檬。而在之前版本的 WebView 上不存在硬鞍。
支付寶平臺上有相關(guān)提問:
Android 7.0 的 WebView 無法調(diào)起支付寶
二聚至、問題原因:
跳轉(zhuǎn)支付寶一般打開一個支付寶提供的一個官方頁面酷勺,
例如:
這時候 WebView 上會加載支付寶的下載頁,并且剛才那個頁面會加載一個喚醒支付寶的 **intent **協(xié)議晚岭。
例如:
處理 intent 協(xié)議可以參考我之前的一個文章:
Android WebView中跳轉(zhuǎn)第三方App
而目前的 Android 7.0 上的系統(tǒng) WebView 內(nèi)核和騰訊的 X5 瀏覽器內(nèi)核不能發(fā)出 intent 協(xié)議鸥印。導(dǎo)致不能喚醒支付寶勋功!其他使用 intent 協(xié)議喚醒第三方App的都會出現(xiàn)這種情況坦报!
三、解決方案:
在我們打開支付寶提供的官方頁面時狂鞋, URL 中包含了 Scheme 參數(shù)片择,所以我們可以通過截取 Scheme 參數(shù)利用 Scheme 協(xié)議喚醒支付寶。
示例代碼:
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;
}
相關(guān)工具代碼:
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特有參數(shù)
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;
}