Comment déterminer si le type de réseau est 2G, 3G ou 4G

J'ai un indicateur sur mon application pour afficher le type de réseau (2G ou 3G ou 4G), mais après avoir obtenu le type de réseau, comment puis-je savoir dans quelle catégorie de vitesse il devrait être?

Je sais comment détecter le type de réseau:

  • Comment le mode Doze affecte-t-il les auditeurs enregistrés (en particulier les auditeurs de capteurs)
  • Android: getString (R.string) en mode statique
  • Problème de mise en page Android - largeurs relatives en pourcentage utilisant le poids
  • Fonctionnement de l'horodatage ADB Logcat
  • Utilisation de la forme dessinable comme fond d'écran xml
  • Comment puis-je alignBaseline à la ligne inférieure de TextView multi-lignes?
  • private TelephonyManager telephonyManager; telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); CurrentNetworkType = telephonyManager.getNetworkType(); 

    Compte tenu des valeurs de retour possibles:

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

    Je considérerais LTE comme étant 4G, mais lequel de ceux-ci est vraiment considéré comme 3G? Tout ce que je considérerais comme 2G.

    Alors, où dessinez-vous la ligne entre 3G ou 3G?

    Mise à jour: J'ai trouvé une autre réponse pertinente à https://stackoverflow.com/a/8548926/949577 Elle utilise ConnectivityManager () pour obtenir le type et le sous-type, puis classe le sous-type à la fois rapidement ou non. Je ne sais pas si l'utilisation de ConnectivityManager () est une meilleure approche puis à l'aide de TelephonyManager (), car elles semblent toutes deux capables de renvoyer le type de réseau.

    J'ai également trouvé un lien qui compare les normes de données sans fil à http://en.wikipedia.org/wiki/Comparison_of_wireless_data_standards .

  • Détecter la restauration du réseau 3G ou Wifi
  • Les téléphones Android ont-ils une adresse MAC lorsqu'ils sont connectés à la 3G?
  • Wifi et 3G même temps
  • Android: Vérifiez que le réseau 3G ou Wifi est activé ou disponible ou non sur le périphérique Android
  • Détecter si la connexion est wifi, 3G ou EDGE dans Android?
  • Android - les prises natives ne suppriment pas le mode 3G-sleep lors de la première tentative
  • 5 Solutions collect form web for “Comment déterminer si le type de réseau est 2G, 3G ou 4G”

    Vous pouvez mettre cette méthode suivante directement dans votre classe Utility:

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

    Merci à l'aide du code source Android. =]

    Basé sur le document du développeur Android et le lien Wikipedia, j'ai donné des commentaires et définissez le type de réseau. Consultez les liens dans les commentaires.

    Vous pouvez utiliser getNetworkType pour obtenir le type de réseau.

      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://goo.gl/R2HOjR ..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://goo.gl/1y10WI .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 //http://goo.gl/bhtVT 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://goo.gl/9t7yrR 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(); } 

    }

    Vous pouvez utiliser getSubtype() pour plus de détails.

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

    Techniquement parlant 1xRTT est une technologie 3G (bien que beaucoup le considèrent 2G basé uniquement sur la vitesse des données). Aussi, vous voudrez ajouter WiMax à votre déclaration de changement pour renvoyer 4G. Ce n'est plus souvent utilisé, mais le réseau WiMax de Sprint est toujours opérationnel pour l'instant.

    Je pense vraiment que vous devez simplement coder la valeur équivalente que vous souhaitez avoir. Un googling rapide de la plupart de ces technologies devrait vous donner une idée de ce qui est considéré comme 3G ou 4G (bien que techniquement, aucun d'eux n'est réel 4G). Comme il ne semble pas y avoir de distinction entre HSPA et HSPA +, vous voudrez peut-être exécuter une sorte de vérification de la vitesse ou de la latence, et allez-y de cette façon.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.