Cómo determinar si el tipo de red es 2G, 3G o 4G

Tengo un indicador en mi aplicación para mostrar el tipo de red (2G o 3G o 4G) pero después de obtener el tipo de red, ¿cómo sé en qué categoría de velocidad debería estar?

Sé cómo detectar el tipo de red:

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

Teniendo en cuenta los posibles valores de retorno:

 // 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) 

Considero que LTE es 4G, pero ¿cuál de estos se considera realmente 3G? Cualquier otra cosa, consideraría 2G.

Entonces, ¿dónde trazas la línea entre 3G o no 3G?

Actualización: encontré otra respuesta relevante en https://stackoverflow.com/a/8548926/949577. Utiliza ConnectivityManager () para obtener el tipo y subtipo y luego clasifica el subtipo como rápido o no. No sé si usar ConnectivityManager () es un mejor enfoque que usar TelephonyManager () ya que ambos parecen ser capaces de devolver el tipo de red.

También encontré un enlace que compara estándares de datos inalámbricos en http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards .

Puede poner este siguiente método directamente en su clase de Utilidad:

 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"; } } 

Gracias a la asistencia del código fuente de Android. =]

Basado en el documento del desarrollador de Android y en el enlace de Wikipedia aquí, he dado comentarios y definido el tipo de red. Verifique los enlaces en el comentario.

Puede usar getNetworkType para obtener el tipo de red.

  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(); } } 

Puede usar getSubtype() para más detalles.

 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; } 

Técnicamente hablando, 1xRTT es una tecnología 3G (aunque muchos lo consideran 2G basado únicamente en la velocidad de datos). También querrá agregar WiMax a su statement de cambio para devolver 4G. Ya no se usa con frecuencia, pero la red WiMax de Sprint todavía está operativa por el momento.

Creo que realmente solo tienes que codificar el valor equivalente que quieres que tengan. Una rápida búsqueda en Google de la mayoría de esas tecnologías debería darte una idea de lo que se considera 3G o 4G (aunque técnicamente ninguno de ellos es real 4G). Dado que no parece haber una distinción entre HSPA y HSPA +, es posible que desee ejecutar algún tipo de control de velocidad o latencia, e ir con él de esa manera.

    Intereting Posts