如何使用WebResourceResponse shouldInterceptRequest阻止广告

时间:2020-04-30 16:29:47

标签: android webview

我通常使用shouldOverrideUrlLoading来阻止网络视图中的广告,但是这次,新网站中的广告链接没有被捕获

public boolean shouldOverrideUrlLoading(WebView view, String url) 

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 

但它是在

中捕获的
public WebResourceResponse shouldInterceptRequest(final WebView view, String url) 

所以,我用了这种方法

 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
                Log.d("soidfzs", url);
                WebResourceResponse webResourceResponse = null;
                if (url.contains("https://googleads") || url.contains("doubleclick") || url.contains("google-analytics.com") || url.contains("adservice") || url.contains("securepubads")) {
                    Log.d("soidfzs", "here");
                    return webResourceResponse;
                } else {
                    return super.shouldInterceptRequest(view, url);
                }

            }

但是,链接仍在加载并显示广告

那么,我应该返回什么?

1 个答案:

答案 0 :(得分:0)

您将在if语句之前返回设置为webResourceResponse的{​​{1}},以检查请求是否针对广告。

null的{​​{3}}指出:

shouldInterceptRequest

因此,在返回* @return A {@link android.webkit.WebResourceResponse} containing the * response information or {@code null} if the WebView should load the * resource itself. 时,您是在告诉WebViewClient加载资源本身,即满足广告请求并加载广告。

为了让请求滑动并返回您自己的值,您必须返回自己的null实例,该实例不能为空,以使其正常工作。

WebResourceResponse

在这里,我将return new WebResourceResponse( "text/html", "UTF-8", null ); (第一个参数)设置为mimeType,尽管也可能是其他东西,例如"text/html"

我将第二个参数"text/plain"设置为encoding(与以前相同:可能还有其他东西)。

现在最重要的部分是:我将第三个参数"UTF-8"设置为data

这将导致WebView获得有效的null实例,该实例不是WebResourceResponse,但是没有数据,因此不会加载任何内容。

请注意,这将触发null,因为WebView客户端实际上无法加载任何内容。这本身不是问题,但是如果您覆盖WebViewClient#onReceivedError,则需要注意一些事项。