72 votes

Comment déterminer si le réseau est de type 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 :

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 le LTE comme de la 4G, mais quels sont ceux qui sont réellement considérés comme de la 3G ? Tout le reste est considéré comme de la 2G.

Où se situe donc la limite entre 3G et non 3G ?

Mise à jour : J'ai trouvé une autre réponse pertinente à l'adresse suivante https://stackoverflow.com/a/8548926/949577 Il utilise ConnectivityManager() pour obtenir le type et le sous-type, puis classe le sous-type comme rapide ou non. Je ne sais pas si l'utilisation de ConnectivityManager() est une meilleure approche que celle de TelephonyManager () puisqu'ils semblent tous deux capables de renvoyer le type de réseau.

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

0 votes

113voto

Anonsage Points 599

Vous pouvez placer la méthode suivante directement dans votre classe Utility :

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

Grâce à l'aide du code source d'Android. =]

3 votes

Comment utiliser ce code dans un téléphone portable à double sim ?

78voto

user1140237 Points 730

D'après le document Android Developer et le lien Wikipedia, j'ai donné des commentaires et défini le type de réseau.

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

1 votes

Si je me connecte au wifi et que j'exécute ce programme, je reçois du gprs, pouvez-vous résoudre ce problème ?

0 votes

@user1140237:Pour mon application, j'ai besoin d'une connexion internet constante, pour laquelle j'utilise un service qui détecte si l'internet est activé ou non, si ce n'est pas le cas, j'active l'internet.Parfois, je suis confronté à une situation dans laquelle la connexion de données est activée depuis longtemps, mais à cause d'un problème, le symbole internet (H, E, etc.) affiché au-dessus du symbole de la force du signal (dans la notification) devient absent.Dans ce contexte où l'internet est activé MAIS où le symbole internet est absent, si j'utilise votre extrait ci-dessus, peut-il détecter si le symbole est présent ou non ?

0 votes

@Basher51 pour vérifier si l'appareil est connecté ou non à Internet, vous pouvez utiliser CONNECTIVITY_ACTION. developer.Android.com/reference/Android/net/ ...et là vous pouvez vérifier si l'internet est connecté et s'il s'agit de 2g/3g ? j'espère que j'ai compris votre problème... si vous voulez plus, posez une question séparée pour ce problème...

10voto

iSun Points 168

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

1 votes

Il serait intéressant de savoir de quel type est "info" ;) ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE) ; NetworkInfo info = cm.getActiveNetworkInfo() ;

3voto

Omega142 Points 21

D'un point de vue technique, 1xRTT est une technologie 3G (bien que beaucoup la considèrent comme 2G sur la seule base de la vitesse des données). Vous devrez également ajouter WiMax à votre déclaration de commutation pour obtenir la 4G. Il n'est plus utilisé souvent, mais le réseau WiMax de Sprint est encore opérationnel pour le moment.

1 votes

Reg. 1xRTT, d'où vient cette information ? Veuillez fournir un lien. Par ailleurs, voulez-vous dire IWLAN pour WiMax ?

1voto

cost Points 1968

Je pense qu'il suffit de coder en dur la valeur équivalente que l'on souhaite leur donner. Une recherche rapide sur Google 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 aucune d'entre elles ne soit réellement 4G). Puisqu'il ne semble pas y avoir de distinction entre HSPA et HSPA+, vous pourriez vouloir effectuer une sorte de vérification de la vitesse ou de la latence, et vous en tenir à cela.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X