web-dev-qa-db-fra.com

shouldOverrideUrlLoading dans WebView pour Android ne fonctionne pas

-Edit: Solution trouvée-
Je l'ai compris après quelques recherches intensives - une personne (je veux dire littéralement une) a dit qu'elle avait plutôt utilisé onPageLoad (); qui a parfaitement fonctionné pour mes besoins. La différence est que onPageLoad () s'exécute plus tard que shouldOverrideUrlLoading, mais cela ne fait aucune différence dans mon code.

J'essaie de configurer l'autorisation Twitter avec OAuth pour une application Android, et jusqu'à présent, je peux envoyer avec succès l'utilisateur à l'URL d'autorisation, cependant, ce que j'essaie de faire maintenant est d'intercepter la redirection vers le rappel (ce qui conduirait juste à une erreur 404, notre URL de rappel ne va pas avoir de page associée sur nos serveurs). Ce que j'essaie de faire est de vérifier si l'URL est notre rappel, extrayez le OAuth Verifier de l'URL. J'ai configuré ma WebView avec ce code:

view = (WebView)findViewById(R.id.twitterWbVw);
view.setWebViewClient(new WebViewClient(){
    @Override
    public boolean shouldOverrideUrlLoading(WebView wView, String url)
    {
        String urlHolder;
        String[] verifExtrctr;
        urlHolder = url.substring(0, url.indexOf('?'));
        System.out.println("url");
        if(urlHolder.equalsIgnoreCase(CALLBACK_URL))
        {
            verifExtrctr = urlHolder.split("?");
            verifExtrctr = verifExtrctr[2].split("=");
            if(verifExtrctr[0].equalsIgnoreCase("oauth_verifier"))
            {
                params[5] = verifExtrctr[1];
                return true;
            }
            else
            {
                System.out.println("Inocorrect callback URL format.");
            }
        }
        else    
        {
            wView.loadUrl(url);
        }
        return true;
    }
});
view.loadUrl(urlAuthorize.toExternalForm());

La chose est même System.out.println ("url"); (que j'utilise pour déboguer) ne fonctionne pas! Donc je suis à peu près sec et ne trouve personne avec un problème similaire. L'URL d'autorisation passe bien, et je peux réussir à autoriser l'application, mais la redirection vers l'URL de rappel pour une raison quelconque n'est jamais interceptée. Toute aide serait appréciée, c'est dans mon onResume () si cela compte.

21
Justin

Après quelques recherches, je conclus que malgré ce que la plupart des tutoriels disent, shouldOverrideUrlLoading() n'est pas appelé quand:

  1. Vous chargez une URL comme

    loadUrl("http://www.google.com");
    
  2. Le navigateur redirige automatiquement l'utilisateur via une redirection HTTP. (Voir le commentaire de @hmac ci-dessous concernant les redirections)

Il le fait cependant, soyez appelé lorsque vous cliquez sur un lien à l'intérieur d'une page Web à l'intérieur de la vue Web. L'IIRC l'autorisation Twitter utilise une redirection HTTP. Bummer, cela serait utile si cela fonctionnait comme le disent tous les tutoriels. Je pense que cela provient d'une très ancienne version de l'API Android ...

Vous voudrez peut-être envisager de remplacer la méthode onProgressChanged d'un WebChromeClient comme ici: Comment écouter une WebView finissant de charger une URL? ou la méthode onPageFinished() de la WebViewClient.

51
citizen conn

J'ai trouvé ce que je pense être une façon raisonnable de le faire grâce à la réponse et aux commentaires précédents qui m'indiquent la bonne direction.

Ce que j'ai fait, c'est remplacer onPageStarted et onPageFinished dans un WebViewClient personnalisé. Le code va quelque chose comme ça ...

@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
  if (pendingUrl == null) {
    pendingUrl = url;
  }
}

@Override
public void onPageFinished(WebView view, String url) {
  if (!url.equals(pendingUrl)) {
    Log.d(TAG, "Detected HTTP redirect " + pendingUrl + "->" + url);
    pendingUrl = null;
  }
}

Et bien sûr, avec Log.d, vous mettriez tout code spécifique que vous souhaitez exécuter lors de la détection de la redirection.

14
Maks

Pour les personnes tombant sur ce problème, lorsque la méthode shouldOverrideUrlLoading(WebView view, WebResourceRequest request) n'est pas appelée, recherchez votre minSdkVersion. Si vous utilisez ci-dessous l'API 24, vous devez utiliser shouldOverrideUrlLoading(WebView view, String url).

0
metodieva