Android webview廣告過濾的實現

WebViewClient的幾個回調函數(本文章轉自  某某某 

要想對Webview實現一些高級操作,首先要學習WebViewClient的用法,這是Webview幾個常用回調函數

  • 1、public boolean shouldOverrideUrlLoading(WebView view, String url): 在點擊請求的是鏈接是纔會調用,重寫此方法返回true表明點擊網頁裏面的鏈接還是在當前的webview裏跳轉,不跳到瀏覽器那邊。
  • 2、public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error)
    重寫此方法可以讓webview處理https請求。
  • 3、public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event):重寫此方法才能夠處理在瀏覽器中的按鍵事件。
  • 4、 public void onLoadResource(WebView view, String url):在加載頁面資源時會調用,每一個資源(比如圖片)的加載都會調用一次。
  • 5、 public void onPageStarted(WebView view, String url, Bitmap favicon) :在頁面加載開始時調用。
  • 6、public void onPageFinished(WebView view, String url) :在頁面加載結束時調用。

初看上面的回調函數,極客人發現了一個巨大的坑,攔截廣告就是攔截加載廣告的js,上面的onLoadResource似乎是很合適的函數,只要判斷onLoadResource的參數url是否是加載廣告js的即可,如果不是廣告相關的url正常加載,如果是則不加載。但是在使用onLoadResource之後才發現根本不行。

這裏引用WebViewClient另外一個回調函數:public WebResourceResponse shouldInterceptRequest(WebView view, String url)

shouldInterceptRequest有兩種重載。

  • public WebResourceResponse shouldInterceptRequest (WebView view, String url)從API 11開始引入,API 21棄用
  • public WebResourceResponse shouldInterceptRequest (WebView view, WebResourceRequest request)從API 21開始引入

這裏極客人暫且使用shouldInterceptRequest (WebView view, String url)完成對webview廣告的攔截。

攔截廣告資源URL

在Webview加載資源時會回調shouldInterceptRequest函數,我們可以通過重寫shouldInterceptRequest函數實現對webview的資源請求進行處理。進行處理後返回數據。如果主程序返回的數據爲null,WebView會自行請求網絡加載資源。這裏有個坑:不是shouldInterceptRequest函數返回null就能屏蔽掉請求!正確的屏蔽請求的方式:

下面是極客人寫的屏蔽廣告的NoAdWebViewClient類: 只需使用webview.setWebViewClient(NoAdWebViewClient webclient)即可屏蔽指定webview的廣告。

判斷URL是否含廣告的ADFilterTool類:該類通過判斷url是否包含在廣告攔截庫中

ADFilterTool.java

廣告url資源文件(廣告攔截庫可自行百度更新):AdUrlString.xml

所謂廣告攔截庫,實際上是請求廣告資源的url合集,網絡上有大量的廣告攔截庫,讀者可以定期更新一下文件來實現對廣告的高效過濾。本文屏蔽的方式比較粗暴,凡是含有廣告資源的域名統統禁止。要想實現更精準的過濾,訪友你可以使用通配符匹配url的方式進行攔截,現在PC端的瀏覽器正是這樣做的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xmlversion="1.0"encoding="utf-8"?>
<resources>
    <string-arrayname="adBlockUrl">
        <item>ubmcmm.baidustatic.com</item>
        <item>cpro2.baidustatic.com</item>
        <item>cpro.baidustatic.com</item>
        <item>s.lianmeng.360.cn</item>
        <item>nsclick.baidu.com</item>
        <item>pos.baidu.com</item>
        <item>cbjs.baidu.com</item>
        <item>cpro.baidu.com</item>
        <item>images.sohu.com/cs/jsfile/js/c.js</item>
        <item>union.sogou.com/</item>
        <item>sogou.com/</item>
        <item>a.baidu.com</item>
        <item>c.baidu.com</item>
 
    </string-array>
</resources>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章