Reputation: 81
I have a problem with how to detect an internet connection, I want if the internet connection has slowly there is show alert dialog or notice about the connection internet slowly.
Here is my code:
private void detectIfLostConnection() {
networkCallback = new ConnectivityManager.NetworkCallback() {
@Override
public void onAvailable(@NonNull Network network) {
super.onAvailable(network);
runOnUiThread(() -> linearNetworkProblem.setVisibility(View.GONE));
}
@Override
public void onLost(@NonNull Network network) {
super.onLost(network);
runOnUiThread(() -> linearNetworkProblem.setVisibility(View.VISIBLE));
}
};
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerDefaultNetworkCallback(networkCallback);
}
I'm using network callback, but here isn't available to check the slow internet.
Any suggestion or answer will be appreciated.
Thank you.
Upvotes: 2
Views: 8021
Reputation: 2982
you can use the below mentioned Connectivity utility class to check if internet connected or speed of the internet connection,
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.telephony.TelephonyManager;
import static androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED;
import static androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED;
import static androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED;
public class Connectivity {
/**
* Get the network info
*
* @param context
* @return
*/
public static NetworkInfo getNetworkInfo(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* Check if there is any connectivity
*
* @param context
* @return
*/
public static boolean isConnected(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected());
}
public static boolean isConnectedWifi(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_WIFI);
}
public static boolean isConnectedMobile(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && info.getType() == ConnectivityManager.TYPE_MOBILE);
}
/**
* Check if there is fast connectivity
*
* @param context
* @return
*/
public static boolean isConnectedFast(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
return (info != null && info.isConnected() && Connectivity.isConnectionFast(info.getType(), info.getSubtype()));
}
/**
* Check if the connection is fast
*
* @param type
* @param subType
* @return
*/
public static boolean isConnectionFast(int type, int subType) {
if (type == ConnectivityManager.TYPE_WIFI) {
return true;
} else if (type == ConnectivityManager.TYPE_MOBILE) {
switch (subType) {
case TelephonyManager.NETWORK_TYPE_1xRTT:
return true; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_CDMA:
return true; // ~ 14-64 kbps
case TelephonyManager.NETWORK_TYPE_EDGE:
return true; // ~ 50-100 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_0:
return true; // ~ 400-1000 kbps
case TelephonyManager.NETWORK_TYPE_EVDO_A:
return true; // ~ 600-1400 kbps
case TelephonyManager.NETWORK_TYPE_GPRS:
return true; // ~ 100 kbps
case TelephonyManager.NETWORK_TYPE_HSDPA:
return true; // ~ 2-14 Mbps
case TelephonyManager.NETWORK_TYPE_HSPA:
return true; // ~ 700-1700 kbps
case TelephonyManager.NETWORK_TYPE_HSUPA:
return true; // ~ 1-23 Mbps
case TelephonyManager.NETWORK_TYPE_UMTS:
return true; // ~ 400-7000 kbps
/*
* Above API level 7, make sure to set android:targetSdkVersion
* to appropriate level to use these
*/
case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
return true; // ~ 1-2 Mbps
case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
return true; // ~ 5 Mbps
case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
return true; // ~ 10-20 Mbps
case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
return false; // ~25 kbps
case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
return true; // ~ 10+ Mbps
// Unknown
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
default:
return false;
}
} else {
return false;
}
}
public static String getConnectionStrength(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
if (info != null && info.isConnected()) {
return Connectivity.getInternetStrength(info.getType(), info.getSubtype(), context);
} else {
return "Not Connected";
}
}
public static String getInternetStrength(int type, int subType, Context context) {
if (type == ConnectivityManager.TYPE_WIFI) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int numberOfLevels = 5;
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);
return "" + level/* + " out of 5"*/;
} else if (type == ConnectivityManager.TYPE_MOBILE) {
switch (subType) {
case TelephonyManager.NETWORK_TYPE_CDMA:
return "" + 1; //Poor
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
return "" + 3; //Fair
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_HSPAP:
case TelephonyManager.NETWORK_TYPE_IDEN:
case TelephonyManager.NETWORK_TYPE_LTE:
return "" + 5; //Good
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
return "" + 0; //No Connection
default:
return "" + 0;
}
} else {
return "Not Connected";
}
}
/***
* Get Device Connection Status
* @param context Calling Context.
* @return Connectivity signal status value which is based on Network Info
*/
public static String getConnectionStatus(Context context) {
NetworkInfo info = Connectivity.getNetworkInfo(context);
if (info == null || !info.isConnected()) {
return Constants.ConnectionSignalStatus.NO_CONNECTIVITY;
} else if (Connectivity.getInternetStatus(info.getType(), info.getSubtype(), context) == 3
&& Utils.getBatteryPercentageDouble(context) > 20) {
return Constants.ConnectionSignalStatus.GOOD_STRENGTH;
} else if (Connectivity.getInternetStatus(info.getType(), info.getSubtype(), context) >= 2
&& Utils.getBatteryPercentageDouble(context) > 20) {
return Constants.ConnectionSignalStatus.FAIR_STRENGTH;
} else if (Connectivity.getInternetStatus(info.getType(), info.getSubtype(), context) >= 2
&& Utils.getBatteryPercentageDouble(context) <= 20) {
return Constants.ConnectionSignalStatus.BATTERY_LOW;
} else {
return Constants.ConnectionSignalStatus.POOR_STRENGTH;
}
}
public static int getInternetStatus(int type, int subType, Context context) {
if (type == ConnectivityManager.TYPE_WIFI) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
int numberOfLevels = 5;
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);
if (level < 2) {
return 2; //Fair
} else {
return 3; //Good
}
} else if (type == ConnectivityManager.TYPE_MOBILE) {
switch (subType) {
case TelephonyManager.NETWORK_TYPE_CDMA:
return 1; //Poor
case TelephonyManager.NETWORK_TYPE_1xRTT:
case TelephonyManager.NETWORK_TYPE_EDGE:
case TelephonyManager.NETWORK_TYPE_GPRS:
return 1; //Fair
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case TelephonyManager.NETWORK_TYPE_EVDO_0:
case TelephonyManager.NETWORK_TYPE_HSDPA:
case TelephonyManager.NETWORK_TYPE_HSPA:
case TelephonyManager.NETWORK_TYPE_HSUPA:
case TelephonyManager.NETWORK_TYPE_UMTS:
case TelephonyManager.NETWORK_TYPE_EHRPD:
case TelephonyManager.NETWORK_TYPE_EVDO_B:
case TelephonyManager.NETWORK_TYPE_HSPAP:
case TelephonyManager.NETWORK_TYPE_IDEN:
case TelephonyManager.NETWORK_TYPE_LTE:
return 3; //Good
case TelephonyManager.NETWORK_TYPE_UNKNOWN:
return 0; //No Connection
default:
return 0;
}
} else {
return 0;
}
}
/**
* Return the availability of cellular data access in background.
*
* @param context Application or Activity context.
*
* @return Availability of cellular data access in background.
*/
public static boolean isBackgroundDataAccessAvailable(Context context) {
boolean isBackgroundDataAccessAvailable = true;
ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
// Checks if the device is on a metered network
if (connMgr.isActiveNetworkMetered()) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// Checks user’s Data Saver settings.
switch (connMgr.getRestrictBackgroundStatus()) {
case RESTRICT_BACKGROUND_STATUS_DISABLED:
// Data Saver is disabled. Since the device is connected to a
// metered network, the app should use less data wherever possible.
isBackgroundDataAccessAvailable = true;
break;
case RESTRICT_BACKGROUND_STATUS_WHITELISTED:
// The app is whitelisted. Wherever possible,
// the app should use less data in the foreground and background.
isBackgroundDataAccessAvailable = true;
break;
case RESTRICT_BACKGROUND_STATUS_ENABLED:
// Background data usage is blocked for this app. Wherever possible,
// the app should also use less data in the foreground.
isBackgroundDataAccessAvailable = false;
break;
}
} else {
NetworkInfo.State state = connMgr.getActiveNetworkInfo().getState();
isBackgroundDataAccessAvailable = state != NetworkInfo.State.DISCONNECTED;
}
} else {
// The device is not on a metered network.
// Use data as required to perform syncs, downloads, and updates.
isBackgroundDataAccessAvailable = true;
}
} else {
isBackgroundDataAccessAvailable = true;
}
return isBackgroundDataAccessAvailable;
}
}
USAGE
boolean isFastConnection = Connectivity.isConnectedFast(ctx);
Upvotes: 2