我想从WebView检查“找不到404页面”,如果它是404,那么我将恢复到 上一页。 Ty为你提供帮助
编辑我想看的网页也是纯粹的.jpg 1.jpg 2.jpg 3.jpg但是我不知道有多少图像存在。因此,如果有人可以提出另一种方法,欢迎他这样做。答案 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();
}
});