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

My application has an indicator that displays the type of network (2G or 3G or 4G), but after receiving the type of network, I will find out in which category of speed it should be?

I know how to determine the type of network:

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 4G, but which one is really considered 3G? Everything 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/3/9459/ ... It uses ConnectivityManager () to get the type and subtype, and then classifies the subtype as fast or not. I don't know if using ConnectivityManager () is a better approach than using TelephonyManager (), as both of them can return a network type.

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

+63
android android-networking 3g 4g
Feb 14 '12 at 20:32
source share
6 answers

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

 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"; default: return "Unknown"; } } 

Thanks to the help of the Android source code. =]

+106
Sep 03 '13 at 2:13
source share

Based on the Android developer document and the Wikipedia link, here I gave comments and determined the type of network. Check the links in the comments.

You can use getNetworkType to get the network type.

  public class CommonUtils { /** * To get device consuming netowkr type is 2g,3g,4g * * @param context * @return "2g","3g","4g" as a String based on the network type */ public static String getNetworkType(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: /** From this link https://en.wikipedia.org/wiki/Evolution-Data_Optimized ..NETWORK_TYPE_EVDO_0 & NETWORK_TYPE_EVDO_A EV-DO is an evolution of the CDMA2000 (IS-2000) standard that supports high data rates. Where CDMA2000 https://en.wikipedia.org/wiki/CDMA2000 .CDMA2000 is a family of 3G[1] mobile technology standards for sending voice, data, and signaling data between mobile phones and cell sites. */ 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: //Log.d("Type", "3g"); //For 3g HSDPA , HSPAP(HSPA+) are main networktype which are under 3g Network //But from other constants also it will 3g like HSPA,HSDPA etc which are in 3g case. //Some cases are added after testing(real) in device with 3g enable data //and speed also matters to decide 3g network type //https://en.wikipedia.org/wiki/4G#Data_rate_comparison return "3g"; case TelephonyManager.NETWORK_TYPE_LTE: //No specification for the 4g but from wiki //I found(LTE (Long-Term Evolution, commonly marketed as 4G LTE)) //https://en.wikipedia.org/wiki/LTE_(telecommunication) return "4g"; default: return "Notfound"; } } /** * To check device has internet * * @param context * @return boolean as per status */ public static boolean isNetworkConnected(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo netInfo = cm.getActiveNetworkInfo(); return netInfo != null && netInfo.isConnected(); } } 
+73
Jun 27 '13 at 11:21
source share

You can use getSubtype() for more details.

 int netType = info.getType(); int netSubtype = info.getSubtype(); if (netType == ConnectivityManager.TYPE_WIFI) { return info.isConnected(); } else if (netType == ConnectivityManager.TYPE_MOBILE && netSubtype == TelephonyManager.NETWORK_TYPE_UMTS && !mTelephony.isNetworkRoaming()) { return info.isConnected(); } else { return false; } 
+9
Feb 14 '12 at 20:40
source share

Technically speaking, 1xRTT is 3G technology (although many consider it 2G based solely on data rate). You will also want to add WiMax to the switch statement to return 4G. It is often not used, but the Sprint WiMax network is still working.

+3
Dec 07 '13 at 4:59
source share

I think you just need to hardcode the equivalent value that you want to have. A quick search of most of these technologies should give you an idea of ​​what 3G or 4G is considered to be (although technically none of them is real 4G). Since there is no difference between HSPA and HSPA +, you might want to do some speed or delay checking and go with it that way.

+1
Feb 14 2018-12-12T00:
source share

Updated version for API 29 / Android Q with 5G support in Kotlin:

 enum class Generation { '2G', '3G', '4G', '5G' } fun getNetworkGeneration(context: Context): Generation? { val telephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager return when (telephonyManager.networkType) { TelephonyManager.NETWORK_TYPE_UNKNOWN -> null TelephonyManager.NETWORK_TYPE_GPRS, TelephonyManager.NETWORK_TYPE_EDGE, TelephonyManager.NETWORK_TYPE_CDMA, TelephonyManager.NETWORK_TYPE_1xRTT, TelephonyManager.NETWORK_TYPE_IDEN, TelephonyManager.NETWORK_TYPE_GSM -> Generation.'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 -> Generation.'3G' TelephonyManager.NETWORK_TYPE_LTE, TelephonyManager.NETWORK_TYPE_IWLAN -> Generation.'4G' TelephonyManager.NETWORK_TYPE_NR -> Generation.'5G' else -> null } } 

Use it like this in your activity:

 val generation = getNetworkGeneration(this) when (generation) { Generation.'2G' -> TODO() Generation.'3G' -> TODO() Generation.'4G' -> TODO() Generation.'5G' -> TODO() null -> TODO() } 
0
Jul 23 '19 at 15:11
source share



All Articles