Android WebView显示广告

参考文档:

1.http://wangbaiyuan.cn/realization-of-android-webview-advertising-filtering.html#prettyPhoto   Android webview广告过滤的实现

2.http://www.jianshu.com/p/d793c8d4ff81       Android快速去掉WebView上的烦人广告


项目中用到了webview加载前端界面,也就是Hybrid  App。

但是在webview显示的界面,出现了广告,在界面上边,或者下边,严重影响用户体验,所以需要去掉广告。

参考了文档1的实现方案,文档1是通过判断广告的url进行实现的。

我进行了一些改变,使用到了正则表达式,也是文档1最后的建议。

实现之后,进行了测试,感觉这个方案是可行的

public WebResourceResponse shouldInterceptRequest(WebView view, String url) 方法会回调给你web界面所有的请求,对没一个请求进行判断,过滤,不是合法的url,禁止请求。

下面是我的实现方案:

1.过滤广告的工具类

/**
 * 过滤广告
 * 

* Created by MyPC on 2017/4/18. */ public class ADFilterTool { /** * 正则表达式 */ private static String PATTERN = ""; static { initPattern(); } /** * 初始化pattern */ private static void initPattern() { PATTERN = getPatternStr(); } /** * 判断url的域名是否合法 *

* 域名是否合法:自己项目中使用的域名,为合法域名;其它域名皆为不合法域名,进行屏蔽 * * @param url * @return */ public static boolean hasNotAd(String url) { if (TextUtils.isEmpty(url)) { return false; } if (TextUtils.isEmpty(PATTERN)) { initPattern(); } if (Pattern.matches(PATTERN, url)) { return true; } return false; } /** * 拼接正则表达式 * * @return */ private static String getPatternStr() { String[] adUrls = App.getInstance().getResources().getStringArray(R.array.legal_domain); if (null != adUrls && adUrls.length > 0) { StringBuffer sb = new StringBuffer("^(https|http)://.*("); for (String a : adUrls) { if (null != a && a.length() > 0) { sb.append(a).append("|"); } } return sb.substring(0, sb.length() - 1) + ").*"; } return null; } }

2.这里是合法的url中域名,把它加到attrs.xml文件中


    
        91md.cc
        91doctors.cn
        qiniu.com
        cnzz.com
        iok.la
        cnzz.mmstat.com
        clouddn.com
    

3.实现WebViewClient类

package com.ylz.cloudhos.doc.ui.widget;


import android.webkit.WebResourceResponse;
import android.webkit.WebView;
import android.webkit.WebViewClient;

import com.ylz.cloudhos.doc.utils.ADFilterTool;

/**
 * 屏蔽广告,通过重载WebViewClient
 * 

* Created by MyPC on 2017/4/18. */ public class NoAdWebViewClient extends WebViewClient { // private String homeurl; // private Context context; // // public NoAdWebViewClient(Context context, String homeurl) { // this.context = context; // this.homeurl = homeurl; // } // // @Override // public WebResourceResponse shouldInterceptRequest(WebView view, String url) { // if (!url.contains(homeurl)) { // if (ADFilterTool.hasNotAd(url)) { // return super.shouldInterceptRequest(view, url); // } else { // return new WebResourceResponse(null, null, null); // } // } else { // return super.shouldInterceptRequest(view, url); // } // } @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { if (ADFilterTool.hasNotAd(url)) { return super.shouldInterceptRequest(view, url); } else { return new WebResourceResponse(null, null, null); } } }

5.替换掉原先WebViewClient类的实现

//        mWebView.setWebViewClient(new WebViewClient() {
//            @Override
//            public void onPageStarted(WebView view, String url, Bitmap favicon) {
//                super.onPageStarted(view, url, favicon);
//                LoadDialog.show(mContext);
//            }
//
//            @Override
//            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
//                LoadDialog.dismiss(mContext);
//            }
//
//            @Override
//            public boolean shouldOverrideUrlLoading(WebView view, String url) {
//                // 返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
//                view.loadUrl(url);
//                return true;
//            }
//        });
        mWebView.setWebViewClient(new NoAdWebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                LoadDialog.show(mContext);
            }

            @Override
            public void onPageFinished(WebView view, String url) {
//                super.onPageFinished(view, url);
                LoadDialog.dismiss(mContext);
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                // 返回值是true的时候控制去WebView打开,为false调用系统浏览器或第三方浏览器
                view.loadUrl(url);
                return true;
            }
        });
然后就完事了。。。。

你可能感兴趣的:(Android)