2010-07-05 3 views
19

Je veux vérifier une "page 404 non trouvée" à partir d'un WebView et si c'est un 404 puis je reviens à la page précédente . Ty pour votre aideComment puis-je vérifier à partir d'Android WebView si une page est une «page 404 non trouvée»?

EDIT aussi les pages Web que je veux voir sont purs .jpg 1.jpg 2.jpg 3.jpg mais je n'ai aucune info de combien d'images existent. Donc, si quelqu'un peut proposer une autre méthode, il est le bienvenu.

+0

Vous pouvez consulter [ce sujet] (http://groups.google.com/group/android-developers/browse_thread/thread/1d2f0b04b2818181/) des développeurs Android groupe. –

Répondre

-4

Joindre un WebViewClient à votre WebView où vous substituez onReceivedError() pour connaître la réponse 404 - mais qui sera probablement retourné comme ERROR_FILE_NOT_FOUND.

+13

Les erreurs d'état HTTP ne sont pas signalées par la méthode 'onReceivedError'. Voir [la documentation] (http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedError%28android.webkit.WebView,%20int,%20java.lang.String,%20java.lang.String % 29) – Mannaz

+0

[La documentation à laquelle vous avez lié] (http://goo.gl/LcFBo) n'est pas d'accord avec vous. Les constantes 'ERROR_' sont pour diverses erreurs HTTP (par exemple, 'ERROR_FILE_NOT_FOUND'). – CommonsWare

+0

Ok, la documentation n'est peut-être pas sans ambiguïté. J'ai implémenté cette méthode et elle n'est pas appelée lorsqu'un site 404 est chargé.Voir [ce fil] (https://code.google.com/p/android/issues/detail?id=968#c3) pour une explication et une déclaration sur ce problème. – Mannaz

4

Je voudrais essayer de détecter le chargement de 404 page. Vous pouvez le faire en implémentant la méthode shouldOverrideUrlLoading dans la classe WebViewClient.

mGenericWebClient = new GenericWebClient(); 
mWebView.setWebViewClient(mGenericWebClient); 

public class GenericWebClient extends WebViewClient { 
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
    { 
     if (url=="your404page.html") { 
      view.goBack(); 
      return true; 
     } 
     return false; 
    } 
} 

Vous pouvez également vérifier si onReceivedError événement apparaît, lorsque l'erreur 404 se produit.

+4

Que faire si 404 page non contrôlée par moi? Visiter un site anonyme renvoie 404? –

3

Vous n'avez pas besoin de charger complètement la page pour vérifier si elle se traduit par une erreur 404:

private int getRange() { 
    try { 
     HttpURLConnection.setFollowRedirects(false); 
     int Count = 1; 
     URL testURL; 
     while (true) { 
      testURL = new URL(
        (myURL + "/" + Integer.toString(Count++) + ".jpg")); 
      HttpURLConnection con = (HttpURLConnection) testURL 
        .openConnection(); 
      con.setRequestMethod("HEAD"); 
      if (con.getResponseCode() == 404) { 
       return Count - 2; 
      } 
      Log.e("RESPONCE", Integer.toString(con.getResponseCode())); 
     } 
    } catch (Exception e) { 

    } 
    return 1; 
} 
+2

Cela n'a rien à voir avec un WebView, qui était la question initiale. –

+3

Je ne suis pas d'accord avec les votes négatifs de cette réponse. Trois ans après la publication de cette réponse, Android 'WebView' n'offre toujours aucun moyen de vérifier le statut HTTP de la page actuellement chargée. Cela laisse au développeur des solutions externes, telles que la contribution de @ weakwire. Il doit être compris que la solution suggérée doit être utilisée comme une étape de "pré-validation", avant (et si) la délégation du chargement de l'URL à "WebView". Je choisis de laisser la qualité du code non commentée, cependant. – dbm

+0

Il semble que ce soit toujours le cas en avril 2017, hein? @dbm – AlexioVay

-4

Si vous êtes webmaster de la page qui est chargé dans WebView vous pouvez définir le titre de la page comme '404'. Ensuite, après que votre page est chargée, vous pouvez obtenir le titre de la page avec la méthode getTitle(). Ensuite, s'il contient 404 ou s'il est différent du titre de votre page, vous pouvez faire ce que vous voulez.

Exemple:

myView.setWebViewClient(new WebViewClient(){ 
    @Override 
     public void onPageFinished(WebView view, String url) { 
      String pageTitle = myView.getTitle(); 
      Toast.makeText(getBaseContext(), pageTitle, Toast.LENGTH_SHORT).show(); 
     } 
}); 
+0

Le titre renvoyé peut ou non contenir 404. Différentes plates-formes et/ou périphériques peuvent renvoyer un nom de titre différent. –

+0

J'ai modifié ma réponse, comme si l'utilisateur était le webmaster de la page. – themaster33

13

je pourrais être quelques années trop tard, mais voici comment je devais le résoudre car aucune de ces réponses a travaillé.

J'ai fini par utiliser onReceivedTitle et comparer le titre avec le titre de la page (dans ce cas "page introuvable") du site que j'essayais d'ouvrir.

webview.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public void onReceivedTitle(WebView view, String title) { 
      // TODO Auto-generated method stub 
      super.onReceivedTitle(view, title); 


      CharSequence pnotfound = "The page cannot be found"; 
      if (title.contains(pnotfound)) { 
       pagenotfound = true; 
       view.stopLoading(); 
       webview.loadUrl("https://www.google.com/search?hl=en&q=stackoverflow"); 

      } 
     } 

     public void onProgressChanged(WebView view, int progress) { 
      activity.setProgress(progress * 1000); 
     } 
    }); 

webview.setWebViewClient(new WebViewClient() { 
     @Override 
     public void onReceivedError(WebView view, int errorCode, 
       String description, String failingUrl) { 

      Toast.makeText(activity, "Oh no! " + description, 
        Toast.LENGTH_SHORT).show(); 

     } 

     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 

      return true; 
     } 

     public void onPageFinished(WebView view, String url) { 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 

      } 
     } 
    }); 

Le "pnotfound" sera différent d'un site à. Mais généralement un site utilise la même "page introuvable" donc vous pouvez utiliser le titre sur le site. Vous pourriez vouloir ajouter un autre si c'est le cas si vous utilisez plusieurs sites.

Espérons que cela aide quelqu'un.

+0

Merci d'avoir fourni ce hack. Il semble qu'il n'y ait pas de moyen simple (non-hacky) pour comprendre un 404. –

+0

C'est une bonne réponse !! Cela a vraiment fonctionné pour moi et m'a sauvé des heures de me cogner la tête contre le mur !!! Merci pour le partage!!! – jabobadilla

+0

Bien que intelligent, ce n'est pas une bonne solution. Vous pourriez être tenté de vérifier que le stock d'Android "page Web n'est pas disponible" pour détecter une erreur de réseau, mais sachez que ceci se cassera pour n'importe quelle autre langue (et que le système d'exploitation pourrait changer ce titre dans le futur). –

0
@Override 
public void onPageFinished(WebView view, String url) { 
    super.onPageFinished(view, url); 
    String pageTitle = myWebView.getTitle(); 
    String[] separated = pageTitle.split("-"); 
    if(separated[0].equals("404")) { 
     Log.i(TAG, "detect page not found error 404"); 
    } 
    else { 
     findViewById(R.id.progress1).setVisibility(View.GONE); 
    } 
} 
11

Démarrage SDK 23 (Android M), vous pouvez utiliser onReceivedHttpError méthode pour attraper 404 et d'autres erreurs HTTP. Il suffit de remplacer l'intérieur de votre WebViewClient

@Override 
public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { 
    Toast.makeText(view.getContext(), "HTTP error "+errorResponse.getStatusCode(), Toast.LENGTH_LONG).show(); 
} 
+1

cela devrait être accepté réponse – rmoore

+0

il a aidé ... bro thanx .... – Hanuman

+1

Gardez à l'esprit que «Ce rappel sera appelé pour toute ressource (iframe, image, etc), pas seulement pour la page principale» - de la docs – Aba

Questions connexes