如何禁用Android WebView中的Deeplink/Applink跳转功能?
Android WebView 拦截 Deeplink/App Link 启动外部应用实现方案
要实现类似微信WebView的拦截效果——阻止网页中的deeplink/App Link直接唤起外部应用,同时提示用户并提供浏览器打开选项,可按以下步骤操作:
核心思路
通过WebViewClient拦截URL加载请求,判断当前URL是否能唤起外部非浏览器应用,若是则拦截WebView的默认处理逻辑,弹出提示对话框引导用户到浏览器打开链接。
具体实现
1. 重写WebViewClient的URL拦截方法
在shouldOverrideUrlLoading中识别并拦截目标URL,兼容新旧API版本:
webView.setWebViewClient(new WebViewClient() { // 适配API 21+ @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (isExternalAppLink(url)) { showBlockedTipDialog(url); return true; // 阻止WebView继续处理该URL } return super.shouldOverrideUrlLoading(view, request); } // 适配API 21以下 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { if (isExternalAppLink(url)) { showBlockedTipDialog(url); return true; } return super.shouldOverrideUrlLoading(view, url); } });
2. 实现URL判断逻辑
编写方法判断当前URL是否为可唤起外部应用的deeplink或App Link:
private boolean isExternalAppLink(String url) { Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); List<ResolveInfo> resolveInfos = getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); if (resolveInfos.isEmpty()) { return false; } // 遍历匹配结果,排除当前应用和常见浏览器 for (ResolveInfo info : resolveInfos) { String pkgName = info.activityInfo.packageName; if (!pkgName.equals(getPackageName()) && !isBrowserPackage(pkgName)) { return true; } } return false; } // 判断是否为浏览器应用包名,可根据需求补充常见浏览器 private boolean isBrowserPackage(String pkgName) { return pkgName.equals("com.android.chrome") || pkgName.equals("com.google.android.browser") || pkgName.equals("com.UCMobile") || pkgName.equals("com.tencent.mtt") || pkgName.equals("org.mozilla.firefox"); }
3. 弹出拦截提示对话框
实现类似微信的提示弹窗,提供浏览器打开选项:
private void showBlockedTipDialog(String url) { new AlertDialog.Builder(this) .setTitle("提示") .setMessage("抱歉无法打开该链接") .setPositiveButton("在浏览器打开", (dialog, which) -> { // 跳转系统浏览器打开目标URL Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(browserIntent); }) .setNegativeButton("取消", null) .show(); }
注意事项
- 确保WebView已开启JavaScript支持(若网页通过JS触发跳转):
webView.getSettings().setJavaScriptEnabled(true); - 浏览器包名列表可根据目标用户群体的常用浏览器补充,避免误拦截正常网页跳转
- 对于部分特殊场景(如网页通过iframe触发的跳转),该逻辑同样能覆盖拦截
内容的提问来源于stack exchange,提问作者Krahmal
相关产品推荐
相关产品推荐

