2011-07-18 8 views
21

-Edit: Solution Found-
Compris après une recherche lourde - une personne (je veux dire littéralement un) a dit qu'ils ont utilisé à la place onPageLoad(); qui a parfaitement fonctionné pour mes fins. La différence est que onPageLoad() s'exécute plus tard que shouldOverrideUrlLoading, mais cela ne fait pas de 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 l'utilisateur avec succès à l'URL d'autorisation, mais ce que j'essaie de faire maintenant, c'est d'intercepter la redirection vers le rappel. (ce qui conduirait juste à une erreur 404, notre URL de callback n'aura pas de page associée sur nos serveurs). Ce que je tente de faire est de vérifier si l'URL est notre rappel, puis d'extraire le vérificateur OAuth de l'URL. Configurer mon WebView avec ce code:shouldOverrideUrlLoading dans WebView pour Android ne fonctionne pas

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()); 

chose est même System.out.println ("url"); (que j'utilise pour déboguer) ne fonctionne pas! Donc, je suis à peu près sèche sur les idées, et je ne trouve personne avec un problème similaire. L'URL d'autorisation passe bien, et je peux 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, ceci est dans mon onResume() si cela est important.

+0

Etes-vous sûr que shouldOverrideUrlLoading est la méthode que vous souhaitez remplacer? –

+0

Je suis assez sûr - Pour autant que je l'ai lu il se lance chaque fois qu'une URL est chargée – Justin

+0

bien si 'System.out.println ("url"); 'n'est pas en cours d'exécution Je pourrais juste tripler vérifier que vous remplacent la bonne méthode –

Répondre

48

Après quelques recherches je conclus que, malgré ce que la plupart des tutoriels disent là-bas, shouldOverrideUrlLoading() ne soit pas appelé lorsque:

  1. Vous chargez une URL comme

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

Il ne cependant, lorsque vous avez appelé vous cliquez sur un lien dans une page Web à l'intérieur du WebView. IIRC l'autorisation de twitter utilise une redirection HTTP. Bummer, ce serait utile si cela fonctionnait comme tous les didacticiels le disent. Je pense que cela est d'une très ancienne version l'API Android ...

Vous pouvez envisager redéfinissant la méthode onProgressChanged d'un WebChromeClient comme ici: How to listen for a WebView finishing loading a URL?ou la méthode onPageFinished() du WebViewClient.

+0

Ah, merci. Je vais utiliser le premier si quoi que ce soit, étant le rappel fait apparaître un écran d'erreur 404, je préfère ne pas l'avoir fini de charger la page. Merci beaucoup. – Justin

+2

OnPageFinished ne fonctionne pas de manière fiable pour moi, mais onProgressChanged le fait. J'ai testé cela en imprimant un message de log avec la progression dans onPageFinished et j'ai remarqué que la progression n'était pas toujours de 100 quand onPageFinished est appelé. Selon la documentation android sur onPageFinished, "Cette méthode est appelée uniquement pour le frame principal", donc je ne pense pas qu'il soit fiable d'utiliser cette méthode pour savoir si la page était vraiment complètement chargée. –

+1

re 2. Cela a changé avec la méthode API 24: 'shouldOverrideUrlLoading (vue WebView, requête WebResourceRequest)' est également appelée pour les redirections mais avec 'request.isRedirect()' vous pouvez contrôler comme vous le souhaitez – hmac

13

J'ai trouvé ce que je pense être un moyen raisonnable de le faire grâce à la réponse précédente et les commentaires me pointent dans la bonne direction.

Ce que j'ai fait est de surcharger 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, ainsi que la Log.d vous mettriez un code spécifique que vous souhaitez exécuter lors de la détection de la redirection.

+3

Ce sont des fonctions d'un custom * WebViewClient *, pas de * WebChromeClient *, juste au cas où quelqu'un tomberait sur – Till

+0

J'ai modifié la réponse pour faire référence à WebViewClient au lieu de WebChromeClient –

Questions connexes