Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine if network type is 2G, 3G or 4G

I have an indicator on my application to display the network type (2G or 3G or 4G) but after getting the network type, how do I know what speed category it should be in?

I know how to detect the network type:

private TelephonyManager telephonyManager; telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); CurrentNetworkType = telephonyManager.getNetworkType(); 

Given the possible return values:

//   public static final int NETWORK_TYPE_1xRTT //   Since: API Level 4 //   Current network is 1xRTT //   Constant Value: 7 (0x00000007) //    //   public static final int NETWORK_TYPE_CDMA //   Since: API Level 4 //   Current network is CDMA: Either IS95A or IS95B //   Constant Value: 4 (0x00000004) //    //   public static final int NETWORK_TYPE_EDGE //   Since: API Level 1 //   Current network is EDGE //   Constant Value: 2 (0x00000002) //    //   public static final int NETWORK_TYPE_EHRPD //   Since: API Level 11 //   Current network is eHRPD //   Constant Value: 14 (0x0000000e) //    //   public static final int NETWORK_TYPE_EVDO_0 //   Since: API Level 4 //   Current network is EVDO revision 0 //   Constant Value: 5 (0x00000005) //    //   public static final int NETWORK_TYPE_EVDO_A //   Since: API Level 4 //   Current network is EVDO revision A //   Constant Value: 6 (0x00000006) //    //   public static final int NETWORK_TYPE_EVDO_B //   Since: API Level 9 //   Current network is EVDO revision B //   Constant Value: 12 (0x0000000c) //    //   public static final int NETWORK_TYPE_GPRS //   Since: API Level 1 //   Current network is GPRS //   Constant Value: 1 (0x00000001) //    //   public static final int NETWORK_TYPE_HSDPA //   Since: API Level 5 //   Current network is HSDPA //   Constant Value: 8 (0x00000008) //    //   public static final int NETWORK_TYPE_HSPA //   Since: API Level 5 //   Current network is HSPA //   Constant Value: 10 (0x0000000a) //    //   public static final int NETWORK_TYPE_HSPAP //   Since: API Level 13 //   Current network is HSPA+ //   Constant Value: 15 (0x0000000f) //    //   public static final int NETWORK_TYPE_HSUPA //   Since: API Level 5 //   Current network is HSUPA //   Constant Value: 9 (0x00000009) //    //   public static final int NETWORK_TYPE_IDEN //   Since: API Level 8 //   Current network is iDen //   Constant Value: 11 (0x0000000b) //    //   public static final int NETWORK_TYPE_LTE //   Since: API Level 11 //   Current network is LTE //   Constant Value: 13 (0x0000000d) //    //   public static final int NETWORK_TYPE_UMTS //   Since: API Level 1 //   Current network is UMTS //   Constant Value: 3 (0x00000003) //    //   public static final int NETWORK_TYPE_UNKNOWN //   Since: API Level 1 //   Network type is unknown //   Constant Value: 0 (0x00000000) 

I would consider LTE to be 4G, but which of these are really considered 3G? Anything else I would consider 2G.

So where do you draw the line between 3G or not 3G?

Update: I found another relevant answer at https://stackoverflow.com/a/8548926/949577 It uses ConnectivityManager() to get type and subtype and then classifies the subtype as either fast or not. I don't know if using ConnectivityManager() is a better approach then using TelephonyManager () since they both appear able to return the network type.

Also I found a link that compares wireless data standards at http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards.

like image 508
Tary Avatar asked Feb 14 '12 20:02

Tary


People also ask

How do I know if my phone is 2G 3G or 4G?

On Android smartphones, go to settings > Network settings > mobile network. It should give you a dropdown menu of mobile standards such as 2G, 3G or LTE (4G). If you don't see 4G or LTE, then your smartphone doesn't support the standard.

How can I know my SIM is 2G or 3G?

Look around on the SIM card for a 3G symbol. If the SIM card is 3G, it will be written on the card. If your SIM card doesn't have a 3G symbol on it, then it is a 2G SIM card.

Is my data 3G or 4G?

The simplest way to check whether the SIM is 3G or 4G is by checking the network settings. A range of networks will be available to choose from, and the phone is 4G enabled if it has a 4G network available in the settings.


1 Answers

You can put this following method directly in your Utility class:

Kotlin:

/** Usage: `networkTypeClass(telephonyManager.networkType)` */ fun networkTypeClass(networkType: Int): String {     when (networkType) {         TelephonyManager.NETWORK_TYPE_GPRS,         TelephonyManager.NETWORK_TYPE_EDGE,         TelephonyManager.NETWORK_TYPE_CDMA,         TelephonyManager.NETWORK_TYPE_1xRTT,         TelephonyManager.NETWORK_TYPE_IDEN,         TelephonyManager.NETWORK_TYPE_GSM         -> return "2G"         TelephonyManager.NETWORK_TYPE_UMTS,         TelephonyManager.NETWORK_TYPE_EVDO_0,         TelephonyManager.NETWORK_TYPE_EVDO_A,         TelephonyManager.NETWORK_TYPE_HSDPA,         TelephonyManager.NETWORK_TYPE_HSUPA,         TelephonyManager.NETWORK_TYPE_HSPA,         TelephonyManager.NETWORK_TYPE_EVDO_B,         TelephonyManager.NETWORK_TYPE_EHRPD,         TelephonyManager.NETWORK_TYPE_HSPAP,         TelephonyManager.NETWORK_TYPE_TD_SCDMA         -> return "3G"         TelephonyManager.NETWORK_TYPE_LTE         -> return "4G"         TelephonyManager.NETWORK_TYPE_NR         -> return "5G"         else -> return "Unknown"     } } 

Java:

public String getNetworkClass(Context context) {     TelephonyManager mTelephonyManager = (TelephonyManager)             context.getSystemService(Context.TELEPHONY_SERVICE);     int networkType = mTelephonyManager.getNetworkType();     switch (networkType) {         case TelephonyManager.NETWORK_TYPE_GPRS:         case TelephonyManager.NETWORK_TYPE_EDGE:         case TelephonyManager.NETWORK_TYPE_CDMA:         case TelephonyManager.NETWORK_TYPE_1xRTT:         case TelephonyManager.NETWORK_TYPE_IDEN:             return "2G";         case TelephonyManager.NETWORK_TYPE_UMTS:         case TelephonyManager.NETWORK_TYPE_EVDO_0:         case TelephonyManager.NETWORK_TYPE_EVDO_A:         case TelephonyManager.NETWORK_TYPE_HSDPA:         case TelephonyManager.NETWORK_TYPE_HSUPA:         case TelephonyManager.NETWORK_TYPE_HSPA:         case TelephonyManager.NETWORK_TYPE_EVDO_B:         case TelephonyManager.NETWORK_TYPE_EHRPD:         case TelephonyManager.NETWORK_TYPE_HSPAP:             return "3G";         case TelephonyManager.NETWORK_TYPE_LTE:             return "4G";         case TelephonyManager.NETWORK_TYPE_NR:             return "5G";         default:             return "Unknown";     } } 

Thanks to assistance from the Android source code. =]

like image 134
Anonsage Avatar answered Sep 22 '22 06:09

Anonsage