如果页面是“未找到404页面”,如何从Android WebView查看?

时间:2010-07-05 19:56:31

标签: android webview

我想从WebView检查“找不到404页面”,如果它是404,那么我将恢复到 上一页。 Ty为你提供帮助

编辑我想看的网页也是纯粹的.jpg 1.jpg 2.jpg 3.jpg但是我不知道有多少图像存在。因此,如果有人可以提出另一种方法,欢迎他这样做。

7 个答案:

答案 0 :(得分:19)

启动SDK 23(Android M),您可以使用const方法来捕获404和其他HTTP错误。只需覆盖onReceivedHttpError

WebViewClient

答案 1 :(得分:15)

我可能已经太晚了几年,但这是我必须解决的问题,因为这些答案都不起作用。

我最终使用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”将因站点而异。但通常一个站点使用相同的“页面未找到”,因此您可以使用站点上的标题。 如果你正在使用多个站点,你可能想要添加一个else。

希望对某人有所帮助。

答案 2 :(得分:4)

我会尝试检测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 :(得分:3)

您无需完全加载页面以检查是否会导致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;
}

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我可能会迟到这个线程,但这是我解决它的方法。由于我的应用程序处理动态 URL 和多语言网站,因此上述解决方案都不适合我。并且 onReceivedHttpError 可以针对任何资源(iframe、图像等)调用,而不仅仅是针对主页,因此我决定为 mainPage 添加一个检查。

我是这样做的:

 @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:如果您的网页网址没有返回 404,这可能对您不起作用。

答案 6 :(得分:-3)

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