如何让WebView仅加载指定URL并拦截广告、弹窗等其他链接
嘿,我来帮你搞定这个WebView拦截问题!要让你的WebView只加载mywebsite.com,拦截所有广告、弹窗等外部链接,核心是通过自定义WebViewClient和处理新窗口请求这两个关键点实现,我给你一步步调整代码:
1. 拦截普通跳转链接
首先给WebView设置自定义WebViewClient,重写链接加载判断方法,只允许mywebsite.com域名下的URL加载:
webView.setWebViewClient(new WebViewClient() { // 适配Android 7.0+的方法 @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); // 检查URL是否属于目标域名,不属于则拦截 return !url.contains("mywebsite.com"); } // 兼容Android 7.0以下版本的方法 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return !url.contains("mywebsite.com"); } });
2. 拦截弹窗(新窗口请求)
广告弹窗通常会触发新窗口创建,所以需要重写WebChromeClient的onCreateWindow方法,阻止外部弹窗加载:
webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { // 获取弹窗请求的URL WebView.HitTestResult result = view.getHitTestResult(); String url = result.getExtra(); // 仅允许目标域名的弹窗在当前WebView加载,其他直接拦截 if (url != null && url.contains("mywebsite.com")) { view.loadUrl(url); } // 返回true表示我们自行处理该请求,不创建新窗口 return true; } });
3. 可选优化:拦截第三方资源加载
如果还想拦截页面内的第三方广告资源(比如广告图片、脚本),可以在WebViewClient里再加一个拦截方法:
@Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (!url.contains("mywebsite.com")) { // 返回空响应,直接拦截资源加载 return new WebResourceResponse(null, null, null); } return super.shouldInterceptRequest(view, request); }
整合后的完整代码
把以上逻辑整合到你的onCreate方法里,最终代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); customViewContainer = (FrameLayout) findViewById(R.id.customViewContainer); webView = (VideoEnabledWebView) findViewById(R.id.your_webview_id); // 替换成你的WebView实际ID // 基础WebView配置(按需调整) WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 若网站依赖JS则开启 webSettings.setSupportMultipleWindows(true); // 必须开启才能处理弹窗请求 // 设置自定义WebViewClient拦截链接和资源 webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); return !url.contains("mywebsite.com"); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return !url.contains("mywebsite.com"); } @Override public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) { String url = request.getUrl().toString(); if (!url.contains("mywebsite.com")) { return new WebResourceResponse(null, null, null); } return super.shouldInterceptRequest(view, request); } }); // 设置WebChromeClient拦截弹窗 webView.setWebChromeClient(new WebChromeClient() { @Override public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { WebView.HitTestResult result = view.getHitTestResult(); String url = result.getExtra(); if (url != null && url.contains("mywebsite.com")) { view.loadUrl(url); } return true; } }); // 加载初始目标网站 webView.loadUrl("https://mywebsite.com"); }
内容的提问来源于stack exchange,提问作者AflamZone
相关产品推荐
相关产品推荐

