Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stop Android WebView from trying to load/capture resources like CSS on loadData()

Background

This may seem to be a duplicate to many other questions. Trust me that it isn't.

I'm trying to load html data into a WebView, being able to capture user hyperlink requests. In the process I've found this answer which does exactly what I want to do, except it captures other requests to things like CSS files and images:

// 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
    }
}

I've shut off automatic image loading, network loads, and Javascript execution:

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

But these do nothing as to preventing the capture of these requests.

Maybe there's a different procedure to capturing the link click, but it was either this or to stop the loading of external resources.

Question

How do I prevent WebView from capturing (or attempting to load) resource requests like CSS, JS, or images?

Otherwise if I can't prevent capturing or attempting to load, how can I differentiate between links clicked and web resources?

Thanks ahead!

like image 984
HelpingHand Avatar asked Sep 14 '25 05:09

HelpingHand


1 Answers

You could override WebViewClient's shouldInterceptRequest and return some non-null response instead of the CSS, JS, images, etc. being fetched.

Example:

    @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);
        }
    }

where R.raw.some_css is:

    body {
      font-family: sans-serif;
    }

Note:
I'm not sure what pages you're loading, but this approach may ruin the look of the page.

like image 107
Gino Mempin Avatar answered Sep 16 '25 19:09

Gino Mempin