Interceptar y anular peticiones HTTP de WebView

Tengo una WebView en mi aplicación en la que se abre algún sitio (siempre el mismo, es mi propia página). El sitio tiene algún código JS que carga algunas imágenes desde el host remoto.

Quiero interceptar las peticiones a dichas imágenes (por patrón de URL) y devolver mi propio contenido (es decir, otra imagen), o dejar la petición intacta dependiendo de la lógica interna de la aplicación.

¿Es posible hacerlo?

EDIT: El estado actual de la cuestión...

WebView tiene una capacidad para establecer un WebViewClient (como se ha señalado por Axarydax). El WebViewClient tiene dos métodos útiles

  • shouldOverrideUrlLoading.
  • onLoadResource

shouldOverrideUrlLoading es capaz de interceptar cualquier carga de url, si la carga es provocada por la interacción con la página (es decir, se hace click en un enlace de una página, WebView.loadURL("") no está provocando este método). También puede cancelar la carga de la URL devolviendo false. Este método no es utilizable, porque no es capaz de interceptar la carga de recursos de página (y las imágenes, lo que necesito interceptar, es un recurso de página).

onLoadResource se activa cada vez que se carga un recurso de página (¡e imágenes! gracias a jessyjones), pero no hay forma de cancelarlo. Eso hace que este método no es adecuado para mi tarea también.

Prueba esto, lo he usado en una aplicación personal tipo wiki:

webView.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.startsWith("foo://")) {
            // magic
            return true;
        }
        return false;
    }
});
Comentarios (8)
Solución

Parece que el nivel 11 de la API tiene soporte para lo que necesitas. Véase WebViewClient.shouldInterceptRequest().

Comentarios (4)

Por lo que yo sé, shouldOverrideUrlLoading no se llama para las imágenes sino para los hipervínculos... Creo que el método apropiado es

@Override public void onLoadResource(WebView view, String url)

Este método es llamado por cada recurso (imagen, hoja de estilo, script) que es cargado por el webview, pero como es un void, no he encontrado una forma de cambiar esa url y reemplazarla para que cargue un recurso local ...

Comentarios (1)