如何从Android WebView检查页面是否为“404页面未找到”?

z6psavjg  于 2023-03-06  发布在  Android
关注(0)|答案(7)|浏览(219)

我想从WebView中检查"404页面未找到",如果是404,则返回到上一页。

编辑

另外,我想看的网页是pure.jpg 1.jpg 2.jpg 3.jpg,但我不知道有多少图片存在。所以,如果有人可以提出另一种方法,他们欢迎这样做。

8ftvxx2r

8ftvxx2r1#

从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();
}
ttp71kqs

ttp71kqs2#

我可能晚了几年,但以下是我不得不解决它的方法,因为这些答案都不起作用。
我最终使用onReceivedTitle并将标题与我试图打开的站点中的页面标题(在本例中为“page not found”)进行比较。

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”在不同的网站会有所不同。但是通常一个网站使用相同的“page not found”,因此你可以使用该网站的标题。如果你使用多个网站,你可能需要添加一个else。
希望对某人有帮助。

kq4fsx7k

kq4fsx7k3#

我会尝试检测404页面的加载。你可以通过在WebViewClient类中实现shouldOverrideUrlLoading方法来实现。

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事件。

wgx48brx

wgx48brx4#

您不需要完全加载该页面来检查是否会导致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;
}
yvt65v4c

yvt65v4c5#

我可能会很晚才看到这个帖子,但我是这样解决这个问题的。因为我的应用程序处理动态URL和多语言网站,上面的解决方案对我都不起作用。而且onReceivedHttpError可以被任何资源调用(iframe,image等),而不仅仅是主页,所以我决定为主页添加一个检查。
我是这么做的:

@Override
public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
    if (request !=null && request.getUrl() !=null)
        if (request.getUrl().toString().equals(dynamicURL) && errorResponse.getStatusCode()==404) {
            //Handle the error
        }
}

这里,dynamicURL是主url,加载到活动的webview中。通过添加此检查,我现在只有在主页抛出404时才会得到错误。
PS:如果你的页面的url没有返回404,这可能对你不起作用。

gmxoilav

gmxoilav6#

@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);
   }
}
3xiyfsfu

3xiyfsfu7#

如果您是正在webview中加载的页面的网站管理员,您可以将您的页面标题设置为'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();
        }
});

相关问题