2010-07-05 11 views
19

Quiero verificar una "página 404 no encontrada" de una WebView y si es una 404, entonces vuelvo a la página anterior . Ty para su ayuda¿Cómo puedo verificar desde Android WebView si una página es una "página 404 no encontrada"?

EDITAR también las páginas web que quiero ver son puras .jpg 1.jpg 2.jpg 3.jpg pero no tengo información de cuántas imágenes existen. Entonces, si alguien puede proponer otro método, puede hacerlo.

+0

Es posible que desee echa un vistazo a [este hilo] (http://groups.google.com/group/android-developers/browse_thread/thread/1d2f0b04b2818181/) del Android-developers grupo. –

Respuesta

-4

Adjuntar un WebViewClient a su WebView, donde se reemplaza onReceivedError() para averiguar acerca de la respuesta 404 - a pesar de que, probablemente, que se obtiene es ERROR_FILE_NOT_FOUND.

+13

Los errores de estado HTTP no se informan a través del método 'onReceivedError'. Consulte [la documentación] (http://developer.android.com/reference/android/webkit/WebViewClient.html#onReceivedError%28android.webkit.WebView,%20int,%20java.lang.String,%20java.lang.String % 29) – Mannaz

+0

[La documentación a la que ha vinculado] (http://goo.gl/LcFBo) no está de acuerdo con usted. Las constantes 'ERROR_' son para varios errores HTTP (por ejemplo,' ERROR_FILE_NOT_FOUND'). – CommonsWare

+0

Ok, la documentación aún podría no ser inequívoca. Implementé este método y no se llama cuando se carga un sitio 404.Consulte [este hilo] (https://code.google.com/p/android/issues/detail?id=968#c3) para obtener una explicación y una declaración sobre este tema. – Mannaz

4

Intentaré detectar la carga de la página 404. Puede hacerlo implementando el método shouldOverrideUrlLoading en la clase 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; 
    } 
} 

También puede comprobar si aparece onReceivedError caso, cuando se produce el error 404.

+4

¿Qué ocurre si la página 404 NO está controlada por mí? ¿Visitar un sitio anónimo devuelve 404? –

3

No es necesario para cargar completamente la página para comprobar si da lugar a un error 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

Esto no tiene nada que ver con un WebView, que era la pregunta original. –

+3

Disiento a diferir con los votos a favor de esta respuesta. Tres años después de la publicación de esta respuesta, Android 'WebView' todavía no ofrece ningún medio para verificar el estado HTTP de la página cargada actualmente. Esto deja al desarrollador con soluciones externas, como la contribución de @ weakwire. Debe entenderse que la solución sugerida debe usarse como un paso de "prevalidación" antes (y si) de la carga de la URL en el 'WebView'. Sin embargo, elijo dejar la calidad del código sin comentarios. – dbm

+0

Parece que este sigue siendo el caso en abril de 2017, ¿eh? @dbm – AlexioVay

-4

Si usted es webmaster de la página que se carga en la vista web usted puede configurar su título de la página como '404'. Luego, después de cargar la página, puede obtener el título de la página con el método getTitle(). Luego, si contiene 404 o si es diferente del título de su página, puede hacer lo que quiera.

Ejemplo:

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

El título devuelto puede o no ser 404. Diferentes plataformas y/o dispositivos pueden devolver un nombre de título diferente. –

+0

He editado mi respuesta, como si el usuario fuera el webmaster de la página. – themaster33

13

que podría ser de unos años demasiado tarde, pero aquí es cómo tuve que resolverlo ya que ninguna de estas respuestas trabajó.

Terminé usando onReceivedTitle y comparé el título con el título de la página (en este caso, "página no encontrada") del sitio que intentaba abrir.

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

      } 
     } 
    }); 

El "pnotfound" será diferente de un sitio a otro. Pero generalmente un sitio utiliza la misma "página no encontrada", por lo tanto, puede usar el título en el sitio. Es posible que desee agregar un else si está utilizando varios sitios.

Espero que ayude a alguien.

+0

Gracias por proporcionar este truco. Parece que no hay una manera directa (no hacky) de descubrir un 404. –

+0

¡Esta es una gran respuesta! ¡Definitivamente funcionó para mí y me ahorró horas golpeándome la cabeza contra la pared! ¡¡¡Gracias por compartir!!! – jabobadilla

+0

Si bien es inteligente, esta no es una buena solución. Puede que tengas la tentación de consultar la página web de Android no disponible para detectar un error de red, pero ten en cuenta que esto se romperá en cualquier otro idioma (y sin mencionar que el sistema operativo podría cambiar este título en el futuro). –

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

partir SDK 23 (Android M) se puede utilizar onReceivedHttpError método para atrapar 404 y otros errores HTTP. Sólo anular dentro de su WebViewClient

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

esto debe aceptarse respuesta – rmoore

+0

ayudó ... bro thanx .... – Hanuman

+1

Tenga en cuenta que 'Esta devolución de llamada se llamará para cualquier recurso (iframe, imagen, etc.), no solo para la página principal' - desde el docs – Aba

Cuestiones relacionadas