web-dev-qa-db-ja.com

Android WebViewから、ページが「404ページが見つかりません」かどうかを確認するにはどうすればよいですか?

WebViewから「404ページが見つかりません」を確認したいのですが、404の場合は前のページに戻ります。あなたの助けのタイ

編集したいウェブページも純粋な.jpg 1.jpg 2.jpg 3.jpgですが、画像の数に関する情報はありません。したがって、誰かが別の方法を提案できる場合は、彼はそうすることができます。

20
weakwire

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();
}
19
Alexey Ozerov

私は数年では遅すぎるかもしれませんが、これらの答えがどれもうまくいかなかったので、ここでそれを解決する必要がありました。

結局、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」はサイトごとに異なります。ただし、通常は1つのサイトが同じ「ページが見つかりません」を使用するため、サイトのタイトルを使用できます。複数のサイトを使用している場合は、elseを追加することをお勧めします。

それが誰かのために役立つことを願っています。

15
LordMarty

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;
   }
}

404エラーが発生したときに、onReceivedErrorイベントが表示されるかどうかを確認することもできます。

4

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