在WebView

时间:2016-02-28 13:15:48

标签: android android-webview

我即将在我的Android应用中推出WebView AdBlocking。我想知道这是否会有效地阻止广告,或者在Webview本身中还有更多要做的事情,我没有修改过。基本上我有一个存储在Android资产中的主机文件,其中列出了数百个广告服务器站点。我将此文件读入我的AdBlocker,然后将其应用于WebViewClient,如下所示:

// AdBlocker.isAdURL(String url)

 public Boolean isAdURL(String url){
      Boolean retValue = false;
      if ((url == null) || (url.isEmpty()))
        return false;
      if ((adServers == null)|| (adServers.size() <1))
        return false;
      try{
        String domainName = getUrlsDomain(url);
        if (adServers.contains(domainName)) {
            retValue = true;
        }
    } catch(URISyntaxException e){

    }

    return retValue;
}

我只在WebViewClient中使用它,如下所示:

@Deprecated
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

      if (adBlocker.isAdURL(url)) {
         ByteArrayInputStream nada = new ByteArrayInputStream("".getBytes());
        return new WebResourceResponse("text/plain", "utf-8", nada);
     }
    return super.shouldInterceptRequest(view, url);
}

同样地:

 @Override
 public WebResourceResponse shouldInterceptRequest(WebView view,  WebResourceRequest request) {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        if (adBlocker.isAdURL(request.getUrl().toString())) {
            ByteArrayInputStream nada = new    ByteArrayInputStream("".getBytes());
            return new WebResourceResponse("text/plain", "utf-8", nada);
        }

    }

    return super.shouldInterceptRequest(view, request);
}

还有什么需要做的吗?或者是这样吗?是否需要保留白名单,或者这通常是假设我的广告服务器列表是最新的?

2 个答案:

答案 0 :(得分:2)

此实现与"whitelist" feature in Cordova基本相同。他们还使用shouldInterceptRequest来阻止对非白名单网站的请求。已知这种方法的缩写,例如,它不会捕获通过WebSockets协议完成的请求(请参阅this book excerpt),但一般情况下它是recommended approach(在该文档中查找shouldInterceptRequest)。

为了做得更好,您需要自己加载所有内容(使用某些HTTP客户端),过滤掉并清理内容,然后将结果传递给WebView以进行渲染。这就是GMail Android应用程序的工作原理(他们在服务器上进行实际清理,但也可以在设备上进行清理)。

答案 1 :(得分:2)

如果有人正在寻找一种更简单的方法来执行此操作,则AdBlock plus Github页面会提供一个AdblockWebView。要使用它,请将此行添加到Gradle文件中:

implementation 'org.adblockplus:adblock-android-webview:3.0'

然后将其添加到布局的XML文件中:

<org.adblockplus.libadblockplus.android.webview.AdblockWebView
    android:id="@+id/main_webview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>