Как я могу проверить из Android WebView, является ли страница "404 страница не найдена"? - PullRequest
20 голосов
/ 05 июля 2010

Я хочу проверить «404 страница не найдена» из WebView, и если это 404, то я вернусь к Предыдущая страница. Ты за помощь

РЕДАКТИРУЙТЕ также веб-страницы, которые я хочу видеть, чистые .jpg 1.jpg 2.jpg 3.jpg, но у меня нет информации о том, сколько изображений существует. Поэтому, если кто-то может предложить другой метод, он может это сделать.

Ответы [ 6 ]

19 голосов
/ 10 апреля 2016

Начиная с SDK 23 (Android M), вы можете использовать метод onReceivedHttpError для перехвата 404 и других ошибок HTTP.Просто переопределите внутри вашего WebViewClient

@Override
public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
    Toast.makeText(view.getContext(), "HTTP error "+errorResponse.getStatusCode(), Toast.LENGTH_LONG).show();
}
15 голосов
/ 16 июля 2013

Возможно, я опоздал на несколько лет, но вот как я должен был решить эту проблему, поскольку ни один из этих ответов не сработал.

В итоге я использовал onReceivedTitle и сравнил заголовок с заголовком страницыв этом случае «страница не найдена») с сайта, который я пытался открыть.

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

            }
        }
    });

«pnotfound» будет отличаться от сайта к сайту.Но обычно один сайт использует ту же «страницу не найдена», поэтому вы можете использовать заголовок на сайте.Возможно, вы захотите добавить еще, если для, если вы используете несколько сайтов.

Надеюсь, это кому-то поможет.

4 голосов
/ 06 июля 2010

Я бы попытался обнаружить загрузку 404 страницы. Вы можете сделать это, реализовав метод shouldOverrideUrlLoading в классе 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;
   }
}

Вы также можете проверить, появляется ли событие onReceivedError, когда возникает ошибка 404.

3 голосов
/ 07 июля 2010

Вам не нужно полностью загружать страницу, чтобы проверить, не приводит ли она к ошибке 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;
}
0 голосов
/ 06 апреля 2016
@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 голосов
/ 06 сентября 2012

Если вы являетесь веб-мастером страницы, которая загружается в веб-просмотре, вы можете установить заголовок страницы как «404». Затем после загрузки страницы вы можете получить заголовок страницы методом getTitle(). Затем, если он содержит 404 или отличается от заголовка вашей страницы, вы можете делать то, что хотите.

Пример:

myView.setWebViewClient(new WebViewClient(){
    @Override  
        public void onPageFinished(WebView view, String url) {  
           String pageTitle = myView.getTitle();
           Toast.makeText(getBaseContext(), pageTitle, Toast.LENGTH_SHORT).show();
        }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...