参考文档:
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;
}
});
然后就完事了。。。。