This only checks if the network interface is available, doesn't guarantee a particular network service is available, for example, there could be low signal or server downtime
private boolean isNetworkInterfaceAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); }
if you want to make a real connection to make sure your connection can gather data from a server or any url:
private boolean isAbleToConnect(String url, int timeout) { try { URL myUrl = new URL(url); URLConnection connection = myUrl.openConnection(); connection.setConnectTimeout(timeout); connection.connect(); return true; } catch (Exception e) { Log.i("exception", "" + e.getMessage()); return false; } }
This function needs to be wrapped in a background thread :
final String action = intent.getAction(); if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { checkConnectivity(context); } } private void checkConnectivity(final Context context) { if (!isNetworkInterfaceAvailable(context)) { Toast.makeText(context, "You are OFFLINE!", Toast.LENGTH_SHORT).show(); return; } final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { final boolean isConnected = isAbleToConnect("http://www.google.com", 1000); handler.post(new Runnable() { @Override public void run() { if (isConnected) Toast.makeText(context, "You are ONLINE!", Toast.LENGTH_SHORT).show(); else Toast.makeText(context, "You are OFFLINE!", Toast.LENGTH_SHORT).show(); } }); } }).start(); }
Add required permissions:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET"/>
Add this line under application in manifest file:
android:usesCleartextTraffic="true"
Add receiver to manifest file:
<receiver android:name=".ConnectivityChangeReceiver" > <intent-filter> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver>
Register/Unregister the BR in you Activity:
@Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"); registerReceiver(connectivityChangeReceiver, filter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(connectivityChangeReceiver); }
this is the entire Broadcast class :
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.util.Log; import android.widget.Toast; import java.net.URL; import java.net.URLConnection; public class ConnectivityChangeReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { checkConnectivity(context); } } private void checkConnectivity(final Context context) { if (!isNetworkInterfaceAvailable(context)) { Toast.makeText(context, "You are OFFLINE!", Toast.LENGTH_SHORT).show(); return; } final Handler handler = new Handler(); new Thread(new Runnable() { @Override public void run() { final boolean isConnected = isAbleToConnect("http://www.google.com", 1000); handler.post(new Runnable() { @Override public void run() { if (isConnected) Toast.makeText(context, "You are ONLINE!", Toast.LENGTH_SHORT).show(); else Toast.makeText(context, "You are OFFLINE!", Toast.LENGTH_SHORT).show(); } }); } }).start(); } //This only checks if the network interface is available, doesn't guarantee a particular network service is available, for example, there could be low signal or server downtime private boolean isNetworkInterfaceAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnectedOrConnecting(); } //This makes a real connection to an url and checks if you can connect to this url, this needs to be wrapped in a background thread private boolean isAbleToConnect(String url, int timeout) { try { URL myUrl = new URL(url); URLConnection connection = myUrl.openConnection(); connection.setConnectTimeout(timeout); connection.connect(); return true; } catch (Exception e) { Log.i("exception", "" + e.getMessage()); return false; } } }