¿Cómo puedo comprobar desde Android WebView si una página es una "página 404 no encontrada"?
Quiero comprobar una "404 página no encontrada" de un WebView y si es un 404 entonces vuelvo a la página anterior. Ty por tu ayuda
EDIT también las páginas web que quiero ver son puros .jpg 1.jpg 2.jpg 3.jpg pero no tengo ninguna información de cuántas imágenes existen. Así que si alguien puede proponer otro método, es bienvenido a hacerlo.
- ¿Cómo determinar cuándo Android WebView está completamente cargado?
- Mostrar documento de Google Docs en un WebView
- ¿Cómo puede detectar Google una solicitud desde un WebView?
- Android WebView lanza "peticiones de origen cruzado sólo son compatibles con http" excepción al intentar cargar recursos desde el disco
- Cómo arreglar "Falta un arrastre mientras esperamos la respuesta de WebCore para tocar hacia abajo"
- JavascriptInterface en el WebView de Android: múltiples llamadas a JS causan interbloqueo
- WebView.loadUrl (url, encabezados) no funciona en android
- (Android) ¿Existe una manera de detectar cuándo se ha seleccionado el texto en una vista web?
- Abrir enlace desde Webview de Android en el navegador normal como popup
- Android: identifica si la vista en la Web reproduce o no el sonido
- GetContentHeight () no funciona correctamente
- ¿Es posible obtener el código HTML de WebView
- JQuery getScript no funciona en Android WebView cuando se utiliza Activos locales / HTML / Recursos
Adjunte un WebViewClient
a su WebView
, donde reemplaza onReceivedError()
para averiguar sobre la respuesta 404 – aunque probablemente se devolverá como ERROR_FILE_NOT_FOUND
.
Podría ser algunos años demasiado tarde, pero aquí es cómo tuve que resolverlo ya que ninguna de estas respuestas funcionó.
Terminé usando onReceivedTitle y comparando el título con el título de la página (en este caso "página no encontrada") del sitio que estaba tratando de 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 por lo general un sitio utiliza la misma "página no encontrada", por lo tanto, puede utilizar el título en el sitio. Es posible que desee añadir otro si para si está utilizando varios sitios.
Espero que ayude para alguien.
Iniciando SDK 23 (Android M) puede utilizar el método onReceivedHttpError
para capturar 404 y otros errores de HTTP. Simplemente WebViewClient
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(); }
Intentaría detectar la carga de 404 páginas. 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 el evento onReceivedError
aparece, cuando se produce un error 404.
Lo hice así. No necesita descargar la página para comprobar si es 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; }
@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); } }
Si eres webmaster de la página que se está cargando en webview, puedes configurar el título de la página como '404'. Luego, después de cargar la página, puedes obtener el título de la página con el método getTitle()
. Entonces si contiene 404
o si es diferente del título de su página usted puede hacer lo que usted quiere.
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(); } });
- Runtime.exec () error: se bloquea sin proporcionar un objeto de proceso
- Altura de diseño de Android mínima de match_parent, pero wrap_content si el contenido es mayor que parent