webview拦截外跳通常在shouldOverrideUrlLoading(WebView view, String url) 这个方法中对url进行处理。可以通过url获取到要跳转的包名进行拦截。
通过url获取外跳app的包名:
private String getAppPackageNameFromUrl(Context context, String url) {
String packageName = "";
try {
PackageManager packageManager = context.getPackageManager();
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
intent.addCategory(Intent.CATEGORY_BROWSABLE);
List<ResolveInfo> localList = packageManager.queryIntentActivities(intent, 0);
if (localList != null && localList.size() != 0) {
ResolveInfo info = localList.get(0);
packageName = info.activityInfo.packageName;
News2345Log.d(TAG, "外跳url对应的包名是:" + packageName);
}
} catch (Exception e) {
e.printStackTrace();
}
return packageName;
}
public boolean shouldOverrideUrlLoading(Activity activity, WebView view, String url) {
if (activity == null || TextUtils.isEmpty(url) || view == null) {
return false;
}
if (!URLUtil.isValidUrl(url)) {
//尝试软件外跳
return processIntentOfUrl(activity, view, url);
}
return false;
}
private boolean processIntentOfUrl(Activity activity, WebView view, String url) {
if (activity == null || TextUtils.isEmpty(url) || view == null) {
return false;
}
if (needIntercept(url)) {
return true;
}
try {
Intent intent = Intent.parseUri(url, Intent.URI_INTENT_SCHEME);
intent.setComponent(null);
activity.startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
网友评论