网型及名字定义在 TelephonyManager 类里。电信的2G为CDMA

Android 判断用户2G/3G/4G移动数据网络

以做 Android App
的时候,为了为用户省流量,为了不刺激用户的气,为了更好之用户体验,是用根据用户眼前网状态来举行有调动之,也足以当
App 的安装模块里,让用户自己挑,在 2G / 3G / 4G
网络条件下,是否允许请求一些流量比较老的多少。

通过 Android 提供的 TelephonyManager 和 ConnectivityManager 都得获到
NetworksInfo 对象,可以经过 getType() 获取类,判断是 wifi 还是 mobile
,如果是 mobile ,可以经过 NetworksInfo 对象的 getSubType() 和
getSubTypeName() 可以得到对的大网型以及名字。

网络项目以及名定义在 TelephonyManager 类里。

/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN = 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE = 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD = 14;
/** Current network is HSPA+ */
public static final int NETWORK_TYPE_HSPAP = 15;

看到此代码和注释,相信没有及时方面知识之总人口很难看懂,都什么东西?这注跟没注释有何区别?!就是于人口看正在更闹心而已。所以说,注释对读代码的口特别要紧。当然这些事物或不过专业了,写这些代码的人口量是怀念写吗非知晓该怎么了,得写多十分一堆啊?!我以结尾见面贴上有些自身收拾的资料,可以供大家参考一下,不是老大详细,也未专业,就是约发生只印象。

TelephonyManager 还提供了 getNetworkTypeName(int type)
的法,这个方法可以返回一个字符串,但是信息量不深。

这就是说怎么判是 2G , 3G 还是 4G 网络为?TelephonyManager
还提供了另外一个措施,getNetworkClass(int networkType)
,但这个方法吃藏掉了,我拿代码贴一下。

public static int getNetworkClass(int networkType) {
    switch (networkType) {
        case NETWORK_TYPE_GPRS:
        case NETWORK_TYPE_EDGE:
        case NETWORK_TYPE_CDMA:
        case NETWORK_TYPE_1xRTT:
        case NETWORK_TYPE_IDEN:
    return NETWORK_CLASS_2_G;
        case NETWORK_TYPE_UMTS:
        case NETWORK_TYPE_EVDO_0:
        case NETWORK_TYPE_EVDO_A:
        case NETWORK_TYPE_HSDPA:
        case NETWORK_TYPE_HSUPA:
        case NETWORK_TYPE_HSPA:
        case NETWORK_TYPE_EVDO_B:
        case NETWORK_TYPE_EHRPD:
        case NETWORK_TYPE_HSPAP:
    return NETWORK_CLASS_3_G;
        case NETWORK_TYPE_LTE:
    return NETWORK_CLASS_4_G;
        default:
    return NETWORK_CLASS_UNKNOWN;
    }
}

  然后底是即时几乎只常量的价。

/** Unknown network class. {@hide} */
public static final int NETWORK_CLASS_UNKNOWN = 0;
/** Class of broadly defined "2G" networks. {@hide} */
public static final int NETWORK_CLASS_2_G = 1;
/** Class of broadly defined "3G" networks. {@hide} */
public static final int NETWORK_CLASS_3_G = 2;
/** Class of broadly defined "4G" networks. {@hide} */
public static final int NETWORK_CLASS_4_G = 3;

  

未晓得也甚要把这些东西让隐蔽起来,然道是无负谱?!还是其它的又好之不二法门?!不了解,先这样吧,现在经上面的一手,是可以掌握用户之所以的凡啊网络,当然也可以区分出用户采取的凡
2G , 3G 还是 4G
了。当然,你收获到这些数据后,你啊堪推算出用户用的是哪家店铺之大网,移动的,联通的,还是电信的,当然,只在华夏。而且虚拟运营商开始确实上市后,这个就是别无出去是京东之,还是国美,苏宁的了,但是你得知晓乃的手机号用的是联通的网还是倒的网。

说到底贴上自收集整理的一对资料,可以参照一下。

  • GPRS : 2G(2.5) General Packet Radia Service 114kbps
  • EDGE : 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
  • UMTS : 3G WCDMA 联通3G Universal Mobile Telecommunication System
    完整的3G移动通信技术标准
  • CDMA : 2G 电信 Code Division Multiple Access 码分多址
  • EVDO_0 : 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution – Data Only
    (Data Optimized) 153.6kps – 2.4mbps 属于3G
  • EVDO_A : 3G 1.8mbps – 3.1mbps 属于3G过渡,3.5G
  • 1xRTT : 2G CDMA2000 1xRTT (RTT – 无线电传输技术) 144kbps 2G的对接,
  • HSDPA : 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet
    Access 14.4mbps
  • HSUPA : 3.5G High Speed Uplink Packet Access 高速上行链路分组接抱
    1.4 – 5.8 mbps
  • HSPA : 3G (分HSDPA,HSUPA) High Speed Packet Access
  • IDEN : 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络
    (属于2G,来自维基百科)
  • EVDO_B : 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
  • LTE : 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE
    Advanced 才是4G
  • EHRPD : 3G CDMA2000通往LTE 4G之中等结果 Evolved High Rate Packet Data
    HRPD的升级
  • HSPAP : 3G HSPAP 比 HSDPA 快些

来情侣说他是活动 4G 的纱,获取到的凡
17。于是自己以失去翻了一下源码,找到了之类的代码。也就是说当起新的花色为支持的时节,Android
会增加对于的路代码。确实 17 是 NETWORKTYPETD_SCDMA
也不怕是挪的那么无异垛。其他的代码就未糊了,大概就是是意思。下面的代码是5.1之代码。

/** Network type is unknown */
public static final int NETWORK_TYPE_UNKNOWN = 0;
/** Current network is GPRS */
public static final int NETWORK_TYPE_GPRS = 1;
/** Current network is EDGE */
public static final int NETWORK_TYPE_EDGE = 2;
/** Current network is UMTS */
public static final int NETWORK_TYPE_UMTS = 3;
/** Current network is CDMA: Either IS95A or IS95B*/
public static final int NETWORK_TYPE_CDMA = 4;
/** Current network is EVDO revision 0*/
public static final int NETWORK_TYPE_EVDO_0 = 5;
/** Current network is EVDO revision A*/
public static final int NETWORK_TYPE_EVDO_A = 6;
/** Current network is 1xRTT*/
public static final int NETWORK_TYPE_1xRTT = 7;
/** Current network is HSDPA */
public static final int NETWORK_TYPE_HSDPA = 8;
/** Current network is HSUPA */
public static final int NETWORK_TYPE_HSUPA = 9;
/** Current network is HSPA */
public static final int NETWORK_TYPE_HSPA = 10;
/** Current network is iDen */
public static final int NETWORK_TYPE_IDEN = 11;
/** Current network is EVDO revision B*/
public static final int NETWORK_TYPE_EVDO_B = 12;
/** Current network is LTE */
public static final int NETWORK_TYPE_LTE = 13;
/** Current network is eHRPD */
public static final int NETWORK_TYPE_EHRPD = 14;
/** Current network is HSPA+ */
public static final int NETWORK_TYPE_HSPAP = 15;
/** Current network is GSM {@hide} */
public static final int NETWORK_TYPE_GSM = 16;
 /** Current network is TD_SCDMA {@hide} */
public static final int NETWORK_TYPE_TD_SCDMA = 17;
/** Current network is IWLAN {@hide} */
public static final int NETWORK_TYPE_IWLAN = 18;

  示例:

////////
    /*
     * 前边注释和后边注释是后来加的判断网络类型
     */
    //WIFI("wifi", 1), G2("2G", 2), G3("3G", 3), WAP("wap", 4), NO("invalid", 5), ALL(
    //"all", 6), G4("4G",7);
    private static final int NETWORK_TYPE_UNAVAILABLE = 5;  
        // private static final int NETWORK_TYPE_MOBILE = -100;  
    private static final int NETWORK_TYPE_WIFI = 1;  

    private static final int NETWORK_CLASS_WIFI = 1;  
    private static final int NETWORK_CLASS_UNAVAILABLE = 5;  
        /** Unknown network class. */  
    private static final int NETWORK_CLASS_UNKNOWN = 6;  
        /** Class of broadly defined "2G" networks. */  
        private static final int NETWORK_CLASS_2_G = 2;  
        /** Class of broadly defined "3G" networks. */  
        private static final int NETWORK_CLASS_3_G = 3;  
        /** Class of broadly defined "4G" networks. */  
        private static final int NETWORK_CLASS_4_G = 7;  
    /** 
     * 获取网络类型 
     *  
     * @return 
     */  
    public String getCurrentNetworkType() {  
        int networkClass = getNetworkClass();  
        String type = "未知";  
        switch (networkClass) {  
        case NETWORK_CLASS_UNAVAILABLE:  
            type = "无";  
            break;  
        case NETWORK_CLASS_WIFI:  
            type = "Wi-Fi";  
            break;  
        case NETWORK_CLASS_2_G:  
            type = "2G";
            break;  
        case NETWORK_CLASS_3_G:  
            type = "3G";  
            break;  
        case NETWORK_CLASS_4_G:  
            type = "4G";  
            break;  
        case NETWORK_CLASS_UNKNOWN:  
            type = "未知";  
            break;  
        }  
        return type;  
    }  

    private int getNetworkClassByType(int networkType) {  
        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 NETWORK_CLASS_2_G;  
        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 NETWORK_CLASS_3_G;  
        case TelephonyManager.NETWORK_TYPE_LTE:  
            return NETWORK_CLASS_4_G;  
        default:  
            return NETWORK_CLASS_UNKNOWN;  
        }  
    }  
    private int getNetworkClass() {  

        connectivityManager = (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE); 
        networkInfo = connectivityManager.getActiveNetworkInfo(); 

            if (networkInfo != null&& networkInfo.isConnected()) {  
                int type = networkInfo.getType();  
                if (type == ConnectivityManager.TYPE_WIFI) {  
                    mNetWorkType =  NetEnum.WIFI.getID();
                } else if (type == ConnectivityManager.TYPE_MOBILE) {  
                    TelephonyManager telephonyManager = (TelephonyManager) this.getSystemService(  
                                    Context.TELEPHONY_SERVICE);  
                    mNetWorkType = getNetworkClassByType(telephonyManager.getNetworkType());
                }  
            } else {  
                mNetWorkType = NETWORK_TYPE_UNAVAILABLE;  
            }  
         return mNetWorkType;
        } 

    ////

  参考博客:http://blog.binkery.com/android/networks_type.html

http://www.eoeandroid.com/thread-540327-1-1.html?_dsign=77a59737

前不久以项目中之所以到啊,总结了生。。。。大部分还是他人总结好的,就直以过来啊,哈哈。。

先是工程Manifest文件要引用:

1 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
2 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

//获取网络服务

 1 public static String getNetworkTypeName(Context context) {
 2      if (context != null) {
 3           ConnectivityManager connectMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
 4           if (connectMgr != null) {
 5                   NetworkInfo info = connectMgr.getActiveNetworkInfo();
 6                   if (info != null) {
 7                        switch (info.getType()) {
 8                             case ConnectivityManager.TYPE_WIFI:
 9                                   return "WIFI";
10                             case ConnectivityManager.TYPE_MOBILE:
11                                   return getNetworkTypeName(info.getSubtype());
12                        }
13                   }
14           }
15      }
16      return getNetworkTypeName(TelephonyManager.NETWORK_TYPE_UNKNOWN);
17 }

//网络型号

 1 public static String getNetworkTypeName(int type) {
 2      switch (type) {
 3           case TelephonyManager.NETWORK_TYPE_GPRS:
 4                return "GPRS";
 5           case TelephonyManager.NETWORK_TYPE_EDGE:
 6                return "EDGE";
 7           case TelephonyManager.NETWORK_TYPE_UMTS:
 8                return "UMTS";
 9           case TelephonyManager.NETWORK_TYPE_HSDPA:
10                return "HSDPA";
11           case TelephonyManager.NETWORK_TYPE_HSUPA:
12                return "HSUPA";
13           case TelephonyManager.NETWORK_TYPE_HSPA:
14                return "HSPA";
15           case TelephonyManager.NETWORK_TYPE_CDMA:
16                return "CDMA";
17           case TelephonyManager.NETWORK_TYPE_EVDO_0:
18                return "CDMA - EvDo rev. 0";
19           case TelephonyManager.NETWORK_TYPE_EVDO_A:
20                return "CDMA - EvDo rev. A";
21           case TelephonyManager.NETWORK_TYPE_EVDO_B:
22                return "CDMA - EvDo rev. B";
23           case TelephonyManager.NETWORK_TYPE_1xRTT:
24                return "CDMA - 1xRTT";
25           case TelephonyManager.NETWORK_TYPE_LTE:
26                return "LTE";
27           case TelephonyManager.NETWORK_TYPE_EHRPD:
28                return "CDMA - eHRPD";
29           case TelephonyManager.NETWORK_TYPE_IDEN:
30                return "iDEN";
31           case TelephonyManager.NETWORK_TYPE_HSPAP:
32                return "HSPA+";
33           default:
34                return "UNKNOWN";
35      }
36 }

调用:

 1 @Override
 2     public void onClick(View view) {
 3         // TODO Auto-generated method stub
 4         switch (view.getId()) {
 5         case R.id.btn_main:
 6              String type =getNetworkTypeName(context);
 7              if (type!=null){
 8                  if ( type.equals("GPRS") || type.equals("EGDE") )
 9                    type ="2G";
10                  else      if (type.equals("CDMA"))
11                        type ="电信 2G";
12                  else if (type.equals("EVDO"))
13                        type ="电信 3G";
14                  else if (type.equals("LTE"))
15                        type ="电信 4G";
16                  else if (type.equals("HSDPA") ||type.equals("UMTS")  )
17                        type ="3G";       
18                  
19              }
20             btn_main.setText(type);
21             break;
22         }

注:

挪或联通的3G为UMTS或HSDPA,移动及联通的2G为GPRS或EGDE,电信的2G为CDMA,电信

的3G为EVDO,电信4G LTE

 

好参考资料:

GPRS 2G(2.5) General Packet Radia Service 114kbps
EDGE 2G(2.75G) Enhanced Data Rate for GSM Evolution 384kbps
UMTS 3G WCDMA 联通3G Universal Mobile Telecommunication System
完整的3G移动通信技术标准
CDMA 2G 电信 Code Division Multiple Access 码分多址
EVDO_0 3G (EVDO 全程 CDMA2000 1xEV-DO) Evolution – Data Only (Data
Optimized) 153.6kps – 2.4mbps 属于3G
EVDO_A 3G 1.8mbps – 3.1mbps 属于3G过渡,3.5G
1xRTT 2G CDMA2000 1xRTT (RTT – 无线电传输技术) 144kbps 2G底接,
HSDPA 3.5G 高速下行分组接入 3.5G WCDMA High Speed Downlink Packet Access
14.4mbps 
HSUPA 3.5G High Speed Uplink Packet Access 高速上行链路分组接抱 1.4 –
5.8 mbps
HSPA 3G (分HSDPA,HSUPA) High Speed Packet Access 
IDEN 2G Integrated Dispatch Enhanced Networks 集成数字增强型网络
(属于2G,来自维基百科)
EVDO_B 3G EV-DO Rev.B 14.7Mbps 下行 3.5G
LTE 4G Long Term Evolution FDD-LTE 和 TDD-LTE , 3G过渡,升级版 LTE
Advanced 才是4G 
EHRPD 3G CDMA2000奔LTE 4G底中档结果 Evolved High Rate Packet Data
HRPD的晋级
HSPAP 3G HSPAP 比 HSDPA 

相关文章