我想从WebView中检查"404页面未找到",如果是404,则返回到上一页。
另外,我想看的网页是pure.jpg 1.jpg 2.jpg 3.jpg,但我不知道有多少图片存在。所以,如果有人可以提出另一种方法,他们欢迎这样做。
8ftvxx2r1#
从SDK 23(Android M)开始,您可以使用onReceivedHttpError方法捕获404和其他HTTP错误。只需在您的WebViewClient中覆盖
onReceivedHttpError
WebViewClient
@Override public void onReceivedHttpError (WebView view, WebResourceRequest request, WebResourceResponse errorResponse) { Toast.makeText(view.getContext(), "HTTP error "+errorResponse.getStatusCode(), Toast.LENGTH_LONG).show(); }
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。希望对某人有帮助。
kq4fsx7k3#
我会尝试检测404页面的加载。你可以通过在WebViewClient类中实现shouldOverrideUrlLoading方法来实现。
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事件。
onReceivedError
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; }
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,这可能对你不起作用。
dynamicURL
webview
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); } }
3xiyfsfu7#
如果您是正在webview中加载的页面的网站管理员,您可以将您的页面标题设置为'404'。然后,在您的页面加载后,您可以使用getTitle()方法获取页面标题。然后,如果它包含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(); } });
7条答案
按热度按时间8ftvxx2r1#
从SDK 23(Android M)开始,您可以使用
onReceivedHttpError
方法捕获404和其他HTTP错误。只需在您的WebViewClient
中覆盖ttp71kqs2#
我可能晚了几年,但以下是我不得不解决它的方法,因为这些答案都不起作用。
我最终使用onReceivedTitle并将标题与我试图打开的站点中的页面标题(在本例中为“page not found”)进行比较。
“pnotfound”在不同的网站会有所不同。但是通常一个网站使用相同的“page not found”,因此你可以使用该网站的标题。如果你使用多个网站,你可能需要添加一个else。
希望对某人有帮助。
kq4fsx7k3#
我会尝试检测404页面的加载。你可以通过在
WebViewClient
类中实现shouldOverrideUrlLoading
方法来实现。您还可以检查发生404错误时是否出现
onReceivedError
事件。wgx48brx4#
您不需要完全加载该页面来检查是否会导致404错误:
yvt65v4c5#
我可能会很晚才看到这个帖子,但我是这样解决这个问题的。因为我的应用程序处理动态URL和多语言网站,上面的解决方案对我都不起作用。而且
onReceivedHttpError
可以被任何资源调用(iframe,image等),而不仅仅是主页,所以我决定为主页添加一个检查。我是这么做的:
这里,
dynamicURL
是主url,加载到活动的webview
中。通过添加此检查,我现在只有在主页抛出404时才会得到错误。PS:如果你的页面的url没有返回404,这可能对你不起作用。
gmxoilav6#
3xiyfsfu7#
如果您是正在webview中加载的页面的网站管理员,您可以将您的页面标题设置为'404'。然后,在您的页面加载后,您可以使用
getTitle()
方法获取页面标题。然后,如果它包含404
或如果它与您的页面标题不同,您可以做您想要做的。示例: