5分钟教你做一个WebView广告过滤器

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fanenqian/article/details/78902584

先来看看效果
这里写图片描述
这站做的好,满满的广告,许多浏览器都有广告屏蔽功能,实现方式也各不相同,今天我们就来实战下怎么样把这些烦人的广告都干掉。


这里讲的是webview里面的广告,所以我们从网页来分析这个页面。
(1)广告的加载过程
这里写图片描述
通过这张图我们能发现网页加载过程是加载js,css,html,以及图片等等一些列的东西,每一个操作都是一个请求,同理,要想加载一个广告那么就必须请求广告。请求广告的链接我们可以通过chrome浏览器开发者模式来抓取。说了这么多还是没说到重点,那到底怎么才能屏蔽广告?【拦截广告的请求】不让广告的请求发出去,广告就获取不到数据了,然后。。。。。然后就没广告了。


(2)WebView拦截器
既然知道了广告的加载过程,接下来就是开始写代码了。webview的基本用法就不重复了,想必各位都会吧。我们先来熟悉下WebViewClient的几个回调函数:

public boolean shouldOverrideUrlLoading(WebView view, String url) 
// 在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边。
public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error)
//重写此方法可以让webview处理https请求。
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)
//重写此方法才能够处理在浏览器中的按键事件。
public void onLoadResource(WebView view, String url) 
//在加载页面资源时会调用,每一个资源(比如图片)的加载都会调用一次。
public void onPageStarted(WebView view, String url, Bitmap favicon) 
//在页面加载开始时调用。
public void onPageFinished(WebView view, String url)
//在页面加载结束时调用。
public WebResourceResponse shouldInterceptRequest(...)

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的广告进行拦截

Webview在加载资源时会回调shouldInterceptRequest函数,通过重写shouldInterceptRequest函数实现对webview的资源请求进行处理。对数据处理后返回数据。但是并不是直接return null就能拦截请求了,如果主程序返回的数据为null,WebView会自行请求网络加载资源。

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView webView, String url) {
                    //判断是否是广告相关的资源链接
                if (!AdFilterTool.isAd(getContext(), url)) {
                    //这里是不做处理的数据
                    return super.shouldInterceptRequest(webView, url);
                } else {
                    //有广告的请求数据,我们直接返回空数据,注:不能直接返回null
                    return new WebResourceResponse(null, null, null);
                }
            }
        });

判断广告库中是否存在当前链接

public class AdFilterTool {
    public static boolean isAd(Context context, String url) {
        Resources res = context.getResources();
        String[] filterUrls = res.getStringArray(R.array.adUrls);
        for (String adUrl : filterUrls ) {
            if (url.contains(adUrl)) {
                return true;
            }
        }
        return false;
    }
}

广告链接库:AdUrls.xml
把你想要拦截的链接,放在这里面,该链接请求的时候就会被拦截,不过广告的拦截规则就得自己想办法去获取了,一般的话只需要获取其域名包含该域名的链接都会被拦截,文章开头也给了一些基本的或者广告资源链接的方式。这里使用的是本地存储拦截数据,你可以把数据存放到服务器,这样更方便广告库的更新

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="adUrls">
        <item>img3.kfkfl.cn</item>
        <item>img3.kfkfl.cn</item>
        <item>c.cnzz.com</item>
        <item>s13.cnzz.com</item>
        <item>js.kfkfl.cn</item>
        <item>img.lianmengma.com</item>
        <item>hnhbyxdq</item>
        <item>hongyangpai</item>
    </string-array>
</resources>

360的一些过滤规则

http://rules.wd.360.cn/

展开阅读全文

没有更多推荐了,返回首页