发新话题
打印

Android WebView显示广告

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.过滤广告的工具类


/**
 * 过滤广告
 * <p>
 * Created by MyPC on 2017/4/18.
 */

public class ADFilterTool {
    /**
     * 正则表达式
     */
    private static String PATTERN = "";

    static {
        initPattern();
    }

    /**
     * 初始化pattern
     */
    private static void initPattern() {
        PATTERN = getPatternStr();
    }

    /**
     * 判断url的域名是否合法
     * <p>
     * 域名是否合法:自己项目中使用的域名,为合法域名;其它域名皆为不合法域名,进行屏蔽
     *
     * @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文件中

<!--项目中用到的合法域名-->
    <string-array name="legal_domain">
        <item>91md.cc</item>
        <item>91doctors.cn</item>
        <item>qiniu.com</item>
        <item>cnzz.com</item>
        <item>iok.la</item>
        <item>cnzz.mmstat.com</item>
        <item>clouddn.com</item>
    </string-array>


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
 * <p>
 * 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;
            }
        });

TOP

发新话题