Android快速去掉WebView上的烦人广告

近日,在把某网站用WebView打包到App里面的时候,出现的一个麻烦。看下图


广告

额,有广告。不影响阅读体验的广告都是可以接受的。但是有一问题是因为有一个广告div比屏幕要大,导致该网页在在移动端上可以左右滑动,这个就没法忍受了,看下图


广告

没办法了,只能把广告去掉了.
首先看看集成网页的代码.
private WebView webView;
private WebSettings settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.activity_main);
    webView = (WebView) findViewById(web);
    //设置WebView属性,能够执行Javascript脚本
    settings = webView.getSettings();
    settings.setJavaScriptEnabled(true);
    settings.setAppCacheEnabled(true);
    webView.setWebViewClient(new NoAdWebViewClient());
    //加载需要显示的网页
    webView.loadUrl("http://champion.gg/");

}

为了支持离线浏览,打开了WebView的默认缓存,设置支持js支持,设置WebClient,这里的NoAdWebViewClient在下面可以看到,在WebViewClient里面去掉广告.

@Override
//设置回退
//覆盖Activity类的onKeyDown(int keyCoder,KeyEvent event)方法
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
        webView.goBack(); //goBack()表示返回WebView的上一页面
        return true;
    }
    return false;
}

重写Activity的onKeyDown简单back案件,当网页可以back的时候让网页回到上一页面.
来看一下NoAdWebViewClient的关键代码:
继承系统的WebViewClient,然后重写onPageFinished方法。

package com.jelly.championgg;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * Created by BrainWang on 05/01/2016.
 */
public class NoAdWebViewClient extends WebViewClient {
    
    private Context context;    

    public NoAdWebViewClient(Context context) {
        this.context = context;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        String js = ADFilterTool.getClearAdDivJs(context);
        Log.v("adJs",js);
        view.loadUrl(js);
    }

}

在onPageFinished里面外面执行的了一段Js,来看一看这段js(以下js为了方便阅读,经过整理):

javascript:
var adDiv0= document.getElementById('div-gpt-ad-1443488528500-4');
if(adDiv0 != null)
    adDiv0.parentNode.removeChild(adDiv0);

var adDiv1= document.getElementById('div-gpt-ad-1443727656867-1');
if(adDiv1 != null)
    adDiv1.parentNode.removeChild(adDiv1);

var adDiv2= document.getElementById('div-gpt-ad-1443488528500-5');
if(adDiv2 != null)
    adDiv2.parentNode.removeChild(adDiv2);
...

去掉广告的原理很简单,注入一段js把显示广告的div删除就ok了,来看一下生成js的代码:

    public static String getClearAdDivJs(Context context){
    String js = "javascript:";
    Resources res = context.getResources();
    String[] adDivs = res.getStringArray(R.array.adBlockDiv);
    for(int i=0;i<adDivs.length;i++){

        js += "var adDiv"+i+"= document.getElementById('"+adDivs[i]+"');if(adDiv"+i+" != null)adDiv"+i+".parentNode.removeChild(adDiv"+i+");";
    }
    return js;
}

通过arrays.xml去管理去要去掉的广告div,遍历广告divId的集合,组合成一段js代码,注入到网页中去掉广告.

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string-array name="adBlockDiv">
        <item>div-gpt-ad-1443488528500-4</item>
        <item>div-gpt-ad-1443727656867-1</item>
        <item>div-gpt-ad-1443488528500-5</item>
        <item>div-gpt-ad-1443488528500-6</item>
        <item>div-gpt-ad-1443488528500-7</item>
        <item>div-gpt-ad-1443727656867-0</item>
        <item>div-gpt-ad-1443488528500-2</item>
        <item>div-gpt-ad-1443488528500-3</item>
        <item>div-gpt-ad-1443488528500-1</item>
    </string-array>

</resources>

那么这些广告div的Id是如何获取的呢?我们通过Chrome浏览器可以很方便的获取到这些Id,可以看到通过F12的调试模式可以轻易的获取到广告div的Id


获取广告ID

完成后我们就可以看到没有广告的页面了,完成效果。


最后效果

其实这里还有一个问题,当网络比较慢的情况下,我们的网页会一直加载,然后当还没有调用onPageFinished的时候,用户就已经开始操作了,所以我们可以优化一下这种方式:
package com.jelly.championgg;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

/**
 * Created by BrainWang on 05/01/2016.
 */
public class NoAdWebViewClient extends WebViewClient {
    private Context context;
    private WebView webView;
    private boolean isClose;

    public NoAdWebViewClient(Context context,WebView webView) {
        this.context = context;
        this.webView = webView;
    }


    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
        if(isClose){ //如果线程正在运行就不用重新开启一个线程了
            return;
        }
        new Thread(new Runnable() {
            @Override
            public void run() {
                isClose = true;
                while (isClose){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    handler.sendEmptyMessage(0x001);
                }
            }
        }).start();
    }

    Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String js = ADFilterTool.getClearAdDivJs(context);
            Log.v("adJs",js);
            webView.loadUrl(js);
        }
    };

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        isClose = false;
    }

}

在NoAdWebViewClient里面我们重写onPageStarted方法,并且开启一个线程,每1秒的循环注入js,在这里由于不能在子线程里面操作WebView,所以利用Handler去注入js.并且在onPageFinished内关闭线程.这样之后,即使网络很慢,在没有回调onPageFinished的时候,也不会出现广告了。

代码地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容