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

Android 瀏覽器圖片屏蔽功能實現原理:HTML 解析攔截與 WebView 設置雙重保險

     編輯:程式設計綜合問答

核心思路

Android 瀏覽器(如 QQ 瀏覽器、Chrome)實現「不加載圖片」主要有兩條路徑:

方案一:WebView 內置設置(最簡單、性能最好)

WebSettings settings = webView.getSettings();
settings.setBlockNetworkImage(true); // API 19+ (KitKat)
// 或舊版
settings.setLoadsImagesAutomatically(false); // 完全禁用圖片加載
  • 優點:底層網絡棧直接丟棄圖片請求,省流量、省電、不走 onLoadResource 回調。
  • 缺點:無法實現「點擊顯示單張圖片」、「僅屏蔽大圖」等精細控制。

方案二:HTML 解析 + DOM 操作(靈活、可實現點擊加載)

  1. 攔截頁面加載:WebViewClient.shouldInterceptRequest() (API 21+) 或 onPageFinished() 注入 JS。
  2. 解析 HTML:用 Jsoup 或正則提取所有 <img> 標籤的 src/data-src。
  3. 替換/標記:
    - 將 src 移至 data-original,src 指向 1px 透明佔位圖或 Base64 灰色塊。
    - 添加 class="lazy-img"、onclick="loadImage(this)"。
  4. 注入回調 JS:
function loadImage(el) {
    el.src = el.dataset.original;
    el.onload = () => el.classList.add('loaded');
    // 通知 Android 端可選:統計、預加載鄰近圖片
    Android.onImageLoad(el.dataset.original);
}

Android 端:webView.addJavascriptInterface(new JsBridge(), "Android");

方案三:網絡層攔截(OkHttp Interceptor / Proxy)

自定義 WebViewClient 返回自定義 WebResourceResponse,在 shouldInterceptRequest 中判斷 URL 後綴(.jpg/.png/.webp)或 Content-Type,直接返回空響應或佔位圖流。
缺點:無法處理 HTTPS(需 MITM 憑證)、無法處理 Data URI、Base64 內嵌圖片。

工程化建議

需求推薦方案關鍵 API
全局省流量模式WebView 內置設置setBlockNetworkImage(true)
懶加載/點擊顯示/圖片壓縮HTML 解析 + JS 注入Jsoup, shouldInterceptRequest, addJavascriptInterface
廣告圖片過濾/隱私保護網絡層攔截 + 規則庫OkHttp Interceptor, EasyList 規則

開源參考

  • AgentWeb:封裝 WebView,內置圖片懶加載、視頻全屏、下載管理。
  • VasSonic:騰訊開源,並行加載、動態緩存、首屏極速渲染。
  • JsBridge:Java-JS 雙向通信標準實現。

選對層級(設置/解析/網絡),圖片屏蔽從「一行代碼」到「完整圖片加載框架」皆可掌控。

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