阻止Android WebView尝试加载/捕获loadData()上的CSS等资源

时间:2016-12-01 23:57:14

标签: javascript android html css webview

背景

这似乎与许多其他问题重复。请相信我不是。

我正在尝试将html数据加载到WebView,以便能够捕获用户超链接请求。在这个过程中,我发现this answer完全符合我的要求,除了它捕获对CSS文件和图像之类的其他请求:

// you tell the webclient you want to catch when a url is about to load
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request){
    return true;
}
// here you execute an action when the URL you want is about to load
@Override
public void onLoadResource(WebView view, String url){
    if( url.equals("http://cnn.com") ){
        // do whatever you want
    }
}

我关闭了自动图片加载,网络加载和Javascript执行:

settings.setBlockNetworkLoads(true);
settings.setBlockNetworkImage(true);
settings.setJavaScriptEnabled(false);

但这些都无法阻止捕获这些请求。

也许有一个不同的过程来捕获链接点击,但它或者是这个或停止加载外部资源。

问题

如何阻止WebView捕获(或尝试加载)CSS,JS或图像等资源请求?

否则,如果我无法阻止捕获或尝试加载,我如何区分所点击的链接和网络资源?

提前致谢!

2 个答案:

答案 0 :(得分:0)

您可以覆盖WebViewClient的shouldInterceptRequest并返回一些非空响应,而不是正在获取的CSS,JS,图像等。

示例:

    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
        Log.d(TAG, "shouldInterceptRequest: " + url);

        if (url.contains(".css")
                || url.contains(".js")
                || url.contains(".ico")) { // add other specific resources..
            return new WebResourceResponse(
                    "text/css",
                    "UTF-8",
                    getActivity().getResources().openRawResource(R.raw.some_css));
        } else {
            return super.shouldInterceptRequest(view, url);
        }
    }

其中R.raw.some_css是:

    body {
      font-family: sans-serif;
    }

注意:
我不确定你正在加载哪些页面,但这种方法可能会破坏页面的外观。

答案 1 :(得分:0)

简短的回答是,你不能。

更长的答案可能是这样的:你无法做到这一点,因为它被设计为“捕获全部或捕获任何东西"”。 Web请求是一般概念,不依赖于像图像或CSS这样的特定资源 - 实际上,它没有任何关于什么的线索。这就是为什么你找不到任何东西的原因。

这样做:在> sessionInfo() R version 3.3.1 (2016-06-21) Platform: x86_64-apple-darwin13.4.0 (64-bit) Running under: OS X 10.11.6 (El Capitan) locale: [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] bartpkg_0.1.0 packrat_0.4.8-1 Rcpp_0.12.8 msm_1.6.4 LaplacesDemon_16.0.1 loaded via a namespace (and not attached): [1] roxygen2_5.0.1 lattice_0.20-34 mvtnorm_1.0-5 digest_0.6.10 grid_3.3.1 magrittr_1.5 [7] stringi_1.1.2 Matrix_1.2-7.1 splines_3.3.1 tools_3.3.1 stringr_1.1.0 survival_2.39-5 [13] parallel_3.3.1 rsconnect_0.5 inline_0.3.14 expm_0.999-0 中,不是一直返回shouldOverrideUrlLoading,而是只为自己想要处理的网址返回true。对于所有其他情况,例如css等,您返回true,因此webview将为您处理。

例如:

false