Ответ 1
Прикрепите WebViewClient
к вашему WebView
, где вы переопределите onReceivedError()
, чтобы узнать о ответе 404, хотя это, вероятно, будет возвращено как ERROR_FILE_NOT_FOUND
.
Я хочу проверить "404 страница не найдена" из WebView, и если она будет 404, я вернусь к Предыдущая страница. Ty для вашей помощи
ИЗМЕНИТЬ также веб-страницы, которые я хочу видеть, являются чистыми .jpg 1.jpg 2.jpg 3.jpg, но у меня нет информации о том, сколько изображений существует. Поэтому, если кто-то может предложить другой метод, он может это сделать.
Прикрепите WebViewClient
к вашему WebView
, где вы переопределите onReceivedError()
, чтобы узнать о ответе 404, хотя это, вероятно, будет возвращено как ERROR_FILE_NOT_FOUND
.
Возможно, я немного опоздал на несколько лет, но вот как я должен был его решить, так как ни один из этих ответов не работал.
Я закончил использование 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, если для, если вы используете несколько сайтов.
Надеюсь, что это поможет кому-то.
Начиная 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();
}
Я попытался бы обнаружить загрузку страницы 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.
Вам не нужно полностью загружать страницу, чтобы проверить, не приводит ли она к ошибке 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;
}
@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);
}
}
Если вы являетесь веб-мастером страницы, загружаемой в 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();
}
});