I'd like to show an error message when there is an error loading a webview page (No connection). This is what I have so far, without the error handling code:
public class TrackerPage extends Activity {
// @Override
private WebView webview;
private ProgressDialog progressDialog;
private boolean error;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Get rid of the android title bar
requestWindowFeature(Window.FEATURE_NO_TITLE);
// Set the XML layout
setContentView(R.layout.tracker_page);
// Bundle objectbundle = this.getIntent().getExtras();
webview = (WebView) findViewById(R.id.tracker);
final Activity activity = this;
// Enable JavaScript and lets the browser go back
webview.getSettings().setJavaScriptEnabled(true);
webview.canGoBack();
webview.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
public void onLoadResource(WebView view, String url) {
// Check to see if there is a progress dialog
if (progressDialog == null) {
// If no progress dialog, make one and set message
progressDialog = new ProgressDialog(activity);
progressDialog.setMessage("Loading please wait...");
progressDialog.show();
// Hide the webview while loading
webview.setEnabled(false);
}
}
public void onPageFinished(WebView view, String url) {
// Page is done loading;
// hide the progress dialog and show the webview
if (progressDialog.isShowing()) {
progressDialog.dismiss();
progressDialog = null;
webview.setEnabled(true);
}
}
});
// The URL that webview is loading
webview.loadUrl("http://url.org/");
}
}
How would I do this?
You might often face issues in updating the chrome and Android System Webview. To fix this problem, you can reboot your device, check your internet connection, stop auto-updating all apps, clear Google Playstore cache, and storage, leave the beta testing program, and manually update Android WebView app from Playstore.
WebChromeClient.CustomViewCallback. A callback interface used by the host application to notify the current page that its custom view has been dismissed.
Android WebView is used to display web page in android. The web page can be loaded from same application or URL. It is used to display online content in android activity.
WebView is a view that display web pages inside your application. You can also specify HTML string and can show it inside your application using WebView. WebView makes turns your application to a web application. In order to add WebView to your application, you have to add <WebView> element to your xml layout file.
All answer above are deprecated. You should use this code after on Page finished
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error){
//Your code to do
Toast.makeText(getActivity(), "Your Internet Connection May not be active Or " + error.getDescription(), Toast.LENGTH_LONG).show();
}
You're most of the way there... Just implement onReceivedError
and handle the errors that you want.
Add this after onpagefinished :
public void onReceivedError(WebView view, int errorCod,String description, String failingUrl) {
Toast.makeText(Webform.this, "Your Internet Connection May not be active Or " + description , Toast.LENGTH_LONG).show();
}
Don't forget to import android.widget.Toast;
Updated answer as per API 23 Marshmallow
WebViewClient Errors Handling
/*
* Added in API level 23 replacing :-
*
* onReceivedError(WebView view, int errorCode, String description, String failingUrl)
*/
@Override
public void onReceivedError(WebView view, WebResourceRequest request,
WebResourceError error) {
Toast.makeText(getActivity(),
"WebView Error" + error.getDescription(),
Toast.LENGTH_SHORT).show();
super.onReceivedError(view, request, error);
}
/*
Added in API level 23
*/
@Override
public void onReceivedHttpError(WebView view,
WebResourceRequest request, WebResourceResponse errorResponse) {
Toast.makeText(getActivity(),
"WebView Error" + errorResponse.getReasonPhrase(),
Toast.LENGTH_SHORT).show();
super.onReceivedHttpError(view, request, errorResponse);
}
Network Error Handling
webView.loadUrl(urlToLoad);
if (!isConnected(getActivity())) {
Toast.makeText(getActivity(), "You are offline ", Toast.LENGTH_SHORT).show();
}
/**
* Check if there is any connectivity
*
* @param context
* @return is Device Connected
*/
public static boolean isConnected(Context context) {
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != cm) {
NetworkInfo info = cm.getActiveNetworkInfo();
return (info != null && info.isConnected());
}
return false;
}
public class WebClient extends WebViewClient {
@Override
@TargetApi(Build.VERSION_CODES.M)
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
final Uri uri = request.getUrl();
handleError(view, error.getErrorCode(), error.getDescription().toString(), uri);
}
@SuppressWarnings("deprecation")
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
final Uri uri = Uri.parse(failingUrl);
handleError(view, errorCode, description, uri);
}
private void handleError(WebView view, int errorCode, String description, final Uri uri) {
final String host = uri.getHost();// e.g. "google.com"
final String scheme = uri.getScheme();// e.g. "https"
// TODO: logic
}
}
in onReceivedError
methode handle like below
@SuppressWarnings("deprecation")
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
handleError(errorCode,view);
}
@TargetApi(android.os.Build.VERSION_CODES.M)
@Override
public void onReceivedError(WebView view, WebResourceRequest req, WebResourceError rerr) {
// Redirect to deprecated method, so you can use it in all SDK versions
onReceivedError(view, rerr.getErrorCode(),rerr.getDescription().toString(),req.getUrl().toString());
}
HandleError methode below
public static void handleError(int errorCode, WebView view) {
String message = null;
if (errorCode == WebViewClient.ERROR_AUTHENTICATION) {
message = "User authentication failed on server";
} else if (errorCode == WebViewClient.ERROR_TIMEOUT) {
message = "The server is taking too much time to communicate. Try again later.";
} else if (errorCode == WebViewClient.ERROR_TOO_MANY_REQUESTS) {
message = "Too many requests during this load";
} else if (errorCode == WebViewClient.ERROR_UNKNOWN) {
message = "Generic error";
} else if (errorCode == WebViewClient.ERROR_BAD_URL) {
message = "Check entered URL..";
} else if (errorCode == WebViewClient.ERROR_CONNECT) {
message = "Failed to connect to the server";
} else if (errorCode == WebViewClient.ERROR_FAILED_SSL_HANDSHAKE) {
message = "Failed to perform SSL handshake";
} else if (errorCode == WebViewClient.ERROR_HOST_LOOKUP) {
message = "Server or proxy hostname lookup failed";
} else if (errorCode == WebViewClient.ERROR_PROXY_AUTHENTICATION) {
message = "User authentication failed on proxy";
} else if (errorCode == WebViewClient.ERROR_REDIRECT_LOOP) {
message = "Too many redirects";
} else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_AUTH_SCHEME) {
message = "Unsupported authentication scheme (not basic or digest)";
} else if (errorCode == WebViewClient.ERROR_UNSUPPORTED_SCHEME) {
message = "unsupported scheme";
} else if (errorCode == WebViewClient.ERROR_FILE) {
message = "Generic file error";
} else if (errorCode == WebViewClient.ERROR_FILE_NOT_FOUND) {
message = "File not found";
} else if (errorCode == WebViewClient.ERROR_IO) {
message = "The server failed to communicate. Try again later.";
}
if (message != null) {
Toast.makeText(getActivity(), "" + message, Toast.LENGTH_LONG).show();
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With