Android WebView, comment gérer les redirections dans l'application au lieu d'ouvrir un navigateur


120

Donc, en ce moment, dans mon application, l'URL à laquelle j'accède a une redirection, et lorsque cela se produit, WebView ouvrira un nouveau navigateur, au lieu de rester dans mon application. Existe-t-il un moyen de modifier les paramètres pour que la vue soit redirigée vers l'URL comme d'habitude, mais reste dans mon application au lieu d'ouvrir un nouveau navigateur?

Éditer:

Je veux l'URL de redirection, je ne sais tout simplement pas comment la créer, donc le seul moyen d'accéder à cette URL est de passer par une URL qui provoquera une redirection vers celle que je veux.

Par exemple: Lorsque vous allez ici: http://www.amazon.com/gp/aw/s/ref=is_box_/k=9780735622777 remarquez comment il redirigera l'URL vers le produit réel. Dans mon application, si je l'ouvre dans un nouveau navigateur, cela fera très bien l'affaire, mais si je la garde dans mon application avec une WebView, elle apparaîtra comme si elle effectuait une recherche pour k = 9780735622777, comme ceci: http://www.amazon.com/gp/aw/s/ref=is_s_?k=k%3D9780735622777&x=0&y=0 . OU, il ouvrira la vue dans le navigateur et montrera ce qui est approprié. Cependant, je souhaite tout conserver dans mon application.

Réponses:


253

Créez un WebViewClient et remplacez la méthode shouldOverrideUrlLoading .

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        // do your handling codes here, which url is the requested url
        // probably you need to open that url rather than redirect:
        view.loadUrl(url);
        return false; // then it is not handled by default action
   }
});

8
J'aime les réponses qui ressemblent à method () {// il suffit de mettre le code que vous ne savez pas utiliser ici}
JMRboosties

19
Veuillez ne pas reproduire le code ci-dessus. Renvoie false à partir du rappel au lieu d'appeler view.loadUrl à la place. L'appel de loadUrl introduit un bug subtil où si vous avez un iframe dans la page avec une URL de schéma personnalisé (par exemple <iframe src = "tel: 123" />), il naviguera dans le cadre principal de votre application vers cette URL, ce qui brisera probablement l'application comme un effet secondaire.
marcin.kosiba

@ marcin.kosiba dépend de la façon dont il est utilisé, pour mon cas d'utilisation, ce que vous décrivez n'est pas un problème mais j'apprécie toujours la mise en
garde

@Warpzit - bien sûr, si vous ne chargez que du contenu de confiance dans la vue Web et que vous avez la garantie à 100% que personne ne peut exploiter ce problème, très bien. OTOH pourquoi courir le risque?
marcin.kosiba

1
Comment puis-je savoir que l'URL qui a appelé la shouldOverrideUrlLoadingméthode est la prochaine URL de redirection? Et je veux l'autoriser?
Phan Sinh

21

Selon la documentation officielle , un clic sur n'importe quel lien dans WebView lance une application qui gère les URL, qui par défaut est un navigateur. Vous devez remplacer le comportement par défaut comme celui-ci

    myWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }
    });

8
Encore mieux, appelez simplement myWebView.setWebViewClient (new WebViewClient ()); L'implémentation par défaut de shouldOverrideUrlLoading renvoie false.
cyroxis

14

Il suffit d'ajouter une personnalisation par défaut WebViewClient. Cela permet au WebView de gérer lui-même toutes les URL chargées.

mWebView.setWebViewClient(new WebViewClient());

8

Vous devrez définir votre méthode de remplacement WebviewClient personnalisée shouldOverrideUrlLoading pour votre vue Web avant de charger l'URL.

mWebView.setWebViewClient(new WebViewClient()
        {
            @SuppressWarnings("deprecation")
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String url)
            {
                return shouldOverrideUrlLoading(url);
            }

            @TargetApi(Build.VERSION_CODES.N)
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, WebResourceRequest request)
            {
                Uri uri = request.getUrl();
                return shouldOverrideUrlLoading(uri.toString());
            }

            private boolean shouldOverrideUrlLoading(final String url)
            {
                Log.i(TAG, "shouldOverrideUrlLoading() URL : " + url);

                // Here put your code

                return true; // Returning True means that application wants to leave the current WebView and handle the url itself, otherwise return false.
            }
        });

Consultez l'exemple de code pour gérer les URL de redirection et ouvrez le PDF sans téléchargement, dans la vue Web. https://gist.github.com/ashishdas09/014a408f9f37504eb2608d98abf49500


Notez que le lien ci-dessus pour un exemple de code n'existe pas.
Jetdog

j'ai téléchargé le lien.
Ashish Das

A travaillé pour moi Merci @AshishDas +10
livemaker

2

Veuillez utiliser le code kotlin ci-dessous

webview.setWebViewClient(object : WebViewClient() {
            override fun shouldOverrideUrlLoading(view: WebView, url: String): Boolean {   
                view.loadUrl(url)
                return false 
            }
        })

Pour plus d'informations cliquez ici


2

Créez une classe qui implémente webviewclient et ajoutez le code suivant qui permet de survoler la chaîne d'URL comme indiqué ci-dessous. Vous pouvez voir ces [exemple] [1]

public class myWebClient extends WebViewClient {

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
         view.loadUrl(url); 
         return true;
     }
}

Sur votre constructeur, créez un objet de vue Web comme indiqué ci-dessous.

   web = new WebView(this); web.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 

Ajoutez ensuite le code suivant pour effectuer le chargement des URL dans votre application

       WebSettings settings=web.getSettings(); 
    settings.setJavaScriptEnabled(true); 
    
    web.loadUrl("http://www.facebook.com");
    web.setWebViewClient(new myWebClient()); 
   
 web.setWebChromeClient(new WebChromeClient() {
      // 
      //
    }

0
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    if (url.equals("your url")) {
        
            Intent intent = new Intent(view.getContext(), TransferAllDoneActivity.class);
            startActivity(intent);
        
    }
}

Bonjour Bienvenue, souhaitez-vous expliquer votre code et nous montrer pourquoi est-ce la bonne réponse?
Ali le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.