是亟需依照用户眼前网络状态来做一些调整的,移动和联通的2G为GPRS或EGDE

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 

相关文章