WebViewClient的几个回调函数(本文章转自  某某某  )

要想对Webview实现一些高级操作,首先要学习WebViewClient的用法,这是Webview几个常用回调函数

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

初看上面的回调函数,极客人发现了一个巨大的坑,拦截广告就是拦截加载广告的js,上面的onLoadResource似乎是很合适的函数,只要判断onLoadResource的参数url是否是加载广告js的即可,如果不是广告相关的url正常加载,如果是则不加载。但是在使用onLoadResource之后才发现根本不行。

这里引用WebViewClient另外一个回调函数:public WebResourceResponse shouldInterceptRequest(WebView view, String url)

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

拦截广告资源URL

在Webview加载资源时会回调shouldInterceptRequest函数,我们可以通过重写shouldInterceptRequest函数实现对webview的资源请求进行处理。进行处理后返回数据。如果主程序返回的数据为null,WebView会自行请求网络加载资源。这里有个坑:不是shouldInterceptRequest函数返回null就能屏蔽掉请求!正确的屏蔽请求的方式:

@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {url = url.toLowerCase();if (!ADFilterTool.hasAd(context, url)) {return super.shouldInterceptRequest(view, url);//正常加载}else{return new WebResourceResponse(null,null,null);//含有广告资源屏蔽请求}}
1
2
3
4
5
6
7
8
9

@Override
    publicWebResourceResponse shouldInterceptRequest(WebViewview,String url){
        url= url.toLowerCase();
if(!ADFilterTool.hasAd(context,url)){
                returnsuper.shouldInterceptRequest(view,url);//正常加载
            }else{
                returnnew WebResourceResponse(null,null,null);//含有广告资源屏蔽请求
            }
    }

下面是极客人写的屏蔽广告的NoAdWebViewClient类: 只需使用webview.setWebViewClient(NoAdWebViewClient webclient)即可屏蔽指定webview的广告。

NoAdWebViewClient 屏蔽广告
package cn.wangbaiyuan.webviewadblock;import android.content.Context; import android.util.Log; import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient;/*** Created by BrainWang on 05/01/2016.*/ public class NoAdWebViewClient extends WebViewClient {private String homeurl;private Context context;public NoAdWebViewClient(Context context,String homeurl) {this.context = context;this.homeurl = homeurl;}@Overridepublic WebResourceResponse shouldInterceptRequest(WebView view, String url) {url = url.toLowerCase();if(!url.contains(homeurl)){if (!ADFilterTool.hasAd(context, url)) {return super.shouldInterceptRequest(view, url);}else{return new WebResourceResponse(null,null,null);}}else{return super.shouldInterceptRequest(view, url);}} }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

packagecn.wangbaiyuan.webviewadblock;
importandroid.content.Context;
import android.util.Log;
importandroid.webkit.WebResourceResponse;
import android.webkit.WebView;
importandroid.webkit.WebViewClient;
/**
* Created by BrainWang on 05/01/2016.
*/
public classNoAdWebViewClient extends WebViewClient{
    private  Stringhomeurl;
    privateContext context;
    publicNoAdWebViewClient(Contextcontext,Stringhomeurl){
        this.context= context;
        this.homeurl= homeurl;
    }
    @Override
    publicWebResourceResponse shouldInterceptRequest(WebViewview,String url){
        url= url.toLowerCase();
        if(!url.contains(homeurl)){
            if(!ADFilterTool.hasAd(context,url)){
                returnsuper.shouldInterceptRequest(view,url);
            }else{
                returnnew WebResourceResponse(null,null,null);
            }
        }else{
            returnsuper.shouldInterceptRequest(view,url);
        }
    }
}

判断URL是否含广告的ADFilterTool类:该类通过判断url是否包含在广告拦截库中

ADFilterTool.java

ADFilterTool判断URL是否含广告
package cn.wangbaiyuan.webviewadblock;import android.content.Context; import android.content.res.Resources; import android.util.Log;/*** Created by BrainWang on 05/01/2016.*/ public class ADFilterTool {public static boolean hasAd(Context context, String url) {Resources res = context.getResources();String[] adUrls = res.getStringArray(R.array.adBlockUrl);for (String adUrl : adUrls) {if (url.contains(adUrl)) {return true;}}return false;} }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

packagecn.wangbaiyuan.webviewadblock;
importandroid.content.Context;
import android.content.res.Resources;
importandroid.util.Log;
/**
* Created by BrainWang on 05/01/2016.
*/
public classADFilterTool {
    publicstatic booleanhasAd(Contextcontext,String url){
        Resources res= context.getResources();
        String[]adUrls =res.getStringArray(R.array.adBlockUrl);
        for(StringadUrl :adUrls){
            if(url.contains(adUrl)){
                returntrue;
            }
        }
        returnfalse;
    }
}

广告url资源文件(广告拦截库可自行百度更新):AdUrlString.xml

所谓广告拦截库,实际上是请求广告资源的url合集,网络上有大量的广告拦截库,读者可以定期更新一下文件来实现对广告的高效过滤。本文屏蔽的方式比较粗暴,凡是含有广告资源的域名统统禁止。要想实现更精准的过滤,访友你可以使用通配符匹配url的方式进行拦截,现在PC端的浏览器正是这样做的。

<?xml version="1.0" encoding="utf-8"?> <resources><string-array name="adBlockUrl"><item>ubmcmm.baidustatic.com</item><item>cpro2.baidustatic.com</item><item>cpro.baidustatic.com</item><item>s.lianmeng.360.cn</item><item>nsclick.baidu.com</item><item>pos.baidu.com</item><item>cbjs.baidu.com</item><item>cpro.baidu.com</item><item>images.sohu.com/cs/jsfile/js/c.js</item><item>union.sogou.com/</item><item>sogou.com/</item><item>a.baidu.com</item><item>c.baidu.com</item></string-array> </resources>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

<?xmlversion="1.0"encoding="utf-8"?>
<resources>
    <string-arrayname="adBlockUrl">
        <item>ubmcmm.baidustatic.com</item>
        <item>cpro2.baidustatic.com</item>
        <item>cpro.baidustatic.com</item>
        <item>s.lianmeng.360.cn</item>
        <item>nsclick.baidu.com</item>
        <item>pos.baidu.com</item>
        <item>cbjs.baidu.com</item>
        <item>cpro.baidu.com</item>
        <item>images.sohu.com/cs/jsfile/js/c.js</item>
        <item>union.sogou.com/</item>
        <item>sogou.com/</item>
        <item>a.baidu.com</item>
        <item>c.baidu.com</item>
    </string-array>
</resources>

Android webview广告过滤的实现相关推荐

  1. Android 应用广告过滤几种方式

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:Dotry链接:https://www.jianshu.com/p/cd1aeed9e3b ...

  2. Android应用广告过滤几种方式

    前言 说起网页广告,那真是让人又恨又爱,它们不但占用了网页的可视控件,分散用户的注意力,还有些浮动广告干扰甚至误导用户操作.但是广告又是开发者重要的收入来源之一,同样作为一名开发者,还是挺能理解的.比 ...

  3. 安卓网页广告拦截_Android webview广告过滤的实现

    现在大部分的android平台的浏览器都具有广告过滤的功能,同时大部分网站都有广告.广告行业是个盈利巨大的产业,就我看来,现在绝大部分的互联网产品,一般有两种营利模式:免费有广告和会员无广告:他们大部 ...

  4. Android WebView显示广告

    参考文档: 1.http://wangbaiyuan.cn/realization-of-android-webview-advertising-filtering.html#prettyPhoto ...

  5. android html拦截广告,Android WebView拦截iframe标签内部跳转教程

    最近项目里有个广告位需要动态配置,后台给了一段 html 嵌套iframe标签的代码,需要Android拦截iframe内部的跳转,自己做处理. 比如,下面是一段html代码,嵌套这iframe标签, ...

  6. Android WebView 性能优化

    原文出处:http://motalks.cn/2016/09/11/Android-WebView-JavaScript-3/ WebView相关阅读 Android WebView 和 javaSc ...

  7. android WebView详解,常见漏洞详解和安全源码(下)

    上篇博客主要分析了 WebView 的详细使用,这篇来分析 WebView 的常见漏洞和使用的坑.  上篇:android WebView详解,常见漏洞详解和安全源码(上)  转载请注明出处:http ...

  8. Android WebView 调起H5支付,提示商家参数格式有误

    题记 -- 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天. 重要消息 精通点的可以查看这里 精述 Flutter 从入门实践到开发一个APP之UI基础篇 视频 flutter从入 ...

  9. 广告过滤算法实现及优化

    一 广告过滤综述 互联网已无处不在的今天,各互联网公司通过各种方式都赚的盆满钵满,其中很重要的一项收入来源就是页面广告,横幅广告,弹窗广告以及视频广告等等,这些对大部分用户来说,已经造成一定烦恼.因此 ...

最新文章

  1. FFmpeg 与媒体文件关系
  2. idea配置 Tomcat Deployment添加时没有Artifact...选择的解决方案
  3. LF将由git中的CRLF替换-那是什么,它很重要吗? [重复]
  4. 【bzoj2751】[HAOI2012]容易题(easy) 数论-快速幂
  5. android 扫描音乐,native.js扫描android手机本地音乐
  6. [ZJOI 2010]count 数字计数
  7. Mybatis 动态sql语句(if标签和where标签)
  8. centos mysql 允许远程访问
  9. eclipse手动pom本地包_(转)如何在maven的pom.xml中添加本地jar包
  10. VS调用tensorflow模型记录
  11. 我用Python可视化了7次人口普查数据变化,你所在的省份还好吗?
  12. dbv连oracle,oracle工具:DBV的用法
  13. 看完必会的正则表达式和递归
  14. link和import的区别,src和href的区别,css hark 以及HTML5及css3的新增特性
  15. 万物革新人们刷脸支付需求越来越多元化
  16. Selenium IDE教程
  17. CSS - Flex属性 - flex-grow / flex-shrink / flex-basis
  18. java keytool用法_Java keytool的用法 | Soo Smart!
  19. 类、结构体(DAY 26)
  20. uniapp 打开高德地图或者百度地图 进行导航

热门文章

  1. java毕业设计乐居租房网的设计与实现Mybatis+系统+数据库+调试部署
  2. 路由器DNS被劫持 解决办法、网站被劫持怎么办怎么解决
  3. python同心圆怎么运行_怎么用python画同心圆
  4. windows10宽带连接无法打开移动热点wifi
  5. 如何从其他平台快速引流到微信?
  6. 微信小程序 - <textarea> 多行文本输入框 placeholder 属性换行显示文字(适用于 vant-weapp 的 Field 输入框文本域组件 van-field)样式修改的详细教程
  7. 如何在连不上wifi的情况下连上wifi
  8. 西瓜决策树-sklearn实现
  9. springMVC+WebUploader实现多图片上传
  10. 【Scratch二次开发】05-翻译国际化