You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何禁用Android WebView中的Deeplink/Applink跳转功能?

要实现类似微信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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:04:02