首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android WebView 去除網頁廣告的實用策略

     編輯:程式設計疑難解答

核心思路:從網址/域名層面攔截

WebView 本身不具備廣告識別能力,最可行的方案是在載入階段攔截已知廣告域名/URL,阻止其請求發出。

方案一:WebViewClient.shouldInterceptRequest(API 21+ 推薦)

webView.setWebViewClient(new WebViewClient() {
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        if (isAdUrl(url)) {
            // 回傳空回應,阻止載入
            return new WebResourceResponse("text/plain", "utf-8", new ByteArrayInputStream(new byte[0]));
        }
        return super.shouldInterceptRequest(view, request);
    }
});

isAdUrl() 可維護一份廣告域名黑名單(如 doubleclick.net, googlesyndication.com 等),或整合開源規則(EasyList、EasyPrivacy)。

方案二:shouldOverrideUrlLoading(舊版 API 相容)

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
    if (isAdUrl(url)) return true; // 攔截,不載入
    return false;
}

注意:此方法僅能攔截主框架導航,無法攔截頁面內的圖片、Script、iframe 請求。

方案三:第三方廣告過濾庫

  • AdBlockWebView:封裝 EasyList 規則,自動攔截廣告請求。
  • uBlock-Android:移植 uBlock Origin 核心,支援完整規則語法。

引入方式(以 AdBlockWebView 為例):

implementation 'com.github.adblockplus:adblockplus-android:2.0.0'
// 使用 AdBlockWebView 替換原生 WebView

進階:注入 CSS/JS 隱藏殘留廣告容器

即使請求被攔截,頁面可能仍保留空白廣告區塊。可在 onPageFinished 注入 CSS:

String css = "iframe[src*='ads'], .ad-banner, #google_ads_iframe { display: none !important; }";
webView.evaluateJavascript(
    "var style = document.createElement('style'); style.innerHTML = `" + css + "`; document.head.appendChild(style);",
    null);

注意事項

  1. 法律與道德:部分網站服務條款禁止廣告攔截,請評估合規風險。
  2. 規則維護:廣告域名頻繁變更,建議定期從 EasyList 更新規則檔。
  3. 效能:大量規則匹配可能影響頁面載入速度,可採用 Trie 樹或 Aho-Corasick 演算法優化。

總結

Android WebView 去除廣告的核心是請求攔截 + 規則庫。推薦使用 shouldInterceptRequest 搭配開源規則(EasyList),並輔以 CSS/JS 隱藏殘留容器。若專案允許,直接整合成熟的 AdBlockWebView 可大幅降低開發成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved