66 votes

Intercepter et remplacer les requêtes HTTP de WebView

J'ai une WebView dans mon application dans laquelle un site est ouvert (toujours le même, c'est ma propre page). Le site a quelques du code JS qui permet de charger des images à partir de l'hôte distant.

Je veux intercepter les demandes pour de telles images (par modèle d'URL) et mon propre contenu (c'est à dire une autre image), ou de demande de congé intacte en fonction interne de la logique de l'application.

Est-il possible de faire cela?

EDIT: l'état actuel de La question...

WebView a la capacité d'établir un WebViewClient (comme indiqué par Axarydax). WebViewClient ont deux méthodes utiles

  • shouldOverrideUrlLoading
  • onLoadResource

shouldOverrideUrlLoading est en mesure d'intercepter n'importe quelle url de chargement, si le chargement est déclenchée par des interactions sur la page (c'est à dire un lien sur une page est cliqué, WebView.loadURL("") n'est pas le déclenchement de cette méthode). Il est également en mesure d'annuler l'URL de chargement, en retournant false. Cette approche n'est pas utilisable, cause " il n'est pas en mesure d'intercepter le chargement de la page de ressources (et des images, ce dont j'ai besoin pour intercepter, est une ressource de page).

onLoadResource déclenche à chaque fois que la page de ressources (et en images! thx pour jessyjones) sont en cours de chargement, mais il n'y a aucun moyen de l'annuler. Ce qui rend cette méthode ne convient pas pour mon travail également.

72voto

Axarydax Points 7787

Essayez ceci, je l'ai utilisé dans une application personnelle de type wiki:

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

55voto

dkneller Points 370

Il semble que l’API de niveau 11 prenne en charge ce dont vous avez besoin. Voir WebViewClient.shouldInterceptRequest() .

11voto

jessyjones Points 108

Pour autant que je sache, shouldOverrideUrlLoading n’est pas appelé pour les images mais plutôt pour les hyperliens ... Je pense que la méthode appropriée est:

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

Cette méthode est appelée pour chaque ressource (image, feuille de style, script) chargée par la vue Web, mais comme il s'agit d'un vide, je n'ai pas trouvé le moyen de changer cette URL et de la remplacer afin qu'elle charge une ressource locale ...

4voto

Schoenobates Points 581

Vous ne mentionnez pas la version de l'API, mais depuis l'API 11, il existe la méthode WebViewClient.shouldInterceptRequest

Peut-être que cela pourrait aider?

3voto

Une solution ultime consisterait à intégrer un simple serveur http à l’écoute sur votre port «secret» en boucle. Ensuite, vous pouvez substituer l'URL src de l'image correspondante par quelque chose comme http: // localhost: 123 /.../ mypic.jpg

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X