您的位置:首页 > 移动开发

Android WebView显示广告

2017-04-19 17:55 337 查看
参考文档:

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;
}
});
然后就完事了。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android webview广告