web-dev-qa-db-fra.com

Comment puis-je vérifier depuis Android webview si une page est une "page 404 non trouvée"?

Je veux vérifier une "page 404 non trouvée" à partir d'une vision webview et si c'est un 404, je reviendrai à la page précédente. TY pour votre aide

Modifier aussi les pages Web que je veux voir sont pure .jpg 1.jpg 2.jpg 3.jpg mais je n'ai aucune information sur combien d'images existent. Donc, si quelqu'un peut proposer une autre méthode, il est invité à le faire.

20
weakwire

Démarrage de SDK 23 (Android M) Vous pouvez utiliser onReceivedHttpError méthode pour attraper 404 et d'autres erreurs HTTP. Juste 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();
}
19
Alexey Ozerov

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

J'ai fini par utiliser Onreceedtitle et comparer le titre avec le titre de la page (dans ce cas "page non trouvée") 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 du site à site. Mais généralement un site utilise la même "page non trouvée", vous pouvez donc utiliser le titre sur le site. Vous voudrez peut-être ajouter un autre si vous utilisez plusieurs sites.

J'espère que cela aide à quelqu'un.

15
LordMarty

J'essaierais de détecter le chargement de 404 pages. Vous pouvez le faire en implémentant shouldOverrideUrlLoading méthode 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
Dariusz Bacinski

Vous n'avez pas besoin de charger complètement la page pour vérifier s'il en résulte 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;
}
3
weakwire
@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);
   }
}
0