webview中的Android块广告

webview中的Android块广告,android,browser,webview,ads,Android,Browser,Webview,Ads,我想在自定义webview客户端(无JavaScript注入)中实现一种机制来阻止广告。这是一种捕获广告并将其替换为来自可信来源的其他广告的方法吗? 要实现这一点,您有两个选择: 使用Javascript注入代码来实现这一点(您明确地说,这是您不想要的) 在WebView中,代替“加载”(当然是正确转义),并将“myproxy.com”设置为一个代理,它将获取上游页面(在“t”查询参数中给出,或以任何其他方式给出),并在向客户端发送响应之前用受信任的页面替换ads。这将是相当复杂的,虽然,因为广

我想在自定义webview客户端(无JavaScript注入)中实现一种机制来阻止广告。这是一种捕获广告并将其替换为来自可信来源的其他广告的方法吗?
要实现这一点,您有两个选择:

  • 使用Javascript注入代码来实现这一点(您明确地说,这是您不想要的)
  • 在WebView中,代替“加载”(当然是正确转义),并将“myproxy.com”设置为一个代理,它将获取上游页面(在“t”查询参数中给出,或以任何其他方式给出),并在向客户端发送响应之前用受信任的页面替换ads。这将是相当复杂的,虽然,因为广告可以在许多形式,他们通常是Javascript注入自己,你可能需要重写在获取HTML,CSS和JS文件等很多URL的
  • 在自定义中,可以重写该函数

    来自Android:

    通知主机应用程序资源请求,并允许应用程序返回数据

    因此,一般的想法是检查请求是否来自广告URL(大量黑名单过滤器),然后返回一个不是广告的“假”资源


    要获得更深入的解释和一个示例,我建议您查看一下。

    我制作了一个自定义的
    WebViewClient
    类似:

    public class MyWebViewClient extends WebViewClient {
    
        @Override
        public void onPageFinished(WebView view, String url) { }
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (url.endsWith(".mp4")) {
                Intent intent = new Intent(Intent.ACTION_VIEW);
                intent.setDataAndType(Uri.parse(url), "video/*");
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                view.getContext().startActivity(intent);
                return true;
            } else if (url.startsWith("tel:") || url.startsWith("sms:") || url.startsWith("smsto:")
                    || url.startsWith("mms:") || url.startsWith("mmsto:")) {
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                view.getContext().startActivity(intent);
                return true;
            } else {
                return super.shouldOverrideUrlLoading(view, url);
            }
        }
    
        private Map<String, Boolean> loadedUrls = new HashMap<>();
    
        @SuppressWarnings("deprecation")
        @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
            boolean ad;
            if (!loadedUrls.containsKey(url)) {
                ad = AdBlocker.isAd(url);
                loadedUrls.put(url, ad);
            } else {
                ad = loadedUrls.get(url);
            }
            return ad ? AdBlocker.createEmptyResource() :
                    super.shouldInterceptRequest(view, url);
        }
    }
    
     webview.setWebViewClient(new MyWebViewClient());
    

    在Javascript注入的情况下,你能给我一个例子吗?或者如果你有一个链接可以帮助我,那就太好了。用JS的方式来做恐怕也不容易。您可以在这里获得AdBlock源代码:,您需要对其进行一些修改。我不知道还有其他类似的好的开源项目。你能帮我提供更多关于你的第二个答案的详细信息吗?可能是一些代码步骤。从上次开始,我一直在努力寻找各种提示,但没有任何效果(或者它只在一些api版本上起作用)@kamituel…我找到了如何配置本地代理的方法,但我不知道如何从本地代理加载url这是正确的答案。链接的博客文章包含一个带有示例代码的详细说明。如何启用和禁用adblocker
     webview.setWebViewClient(new MyWebViewClient());