Android端如何获取手机当前的网络状态,比如wifi还是3G, 还是2G, 电信还是联通,还是移动

不多说了,直接看代码, NB人会懂的!

    1. package com.example.vdisktest;  
    2.   
    3. import android.app.Activity;  
    4. import android.content.Context;  
    5. import android.database.Cursor;  
    6. import android.net.ConnectivityManager;  
    7. import android.net.NetworkInfo;  
    8. import android.net.Uri;  
    9. import android.os.Bundle;  
    10. import android.telephony.TelephonyManager;  
    11. import android.text.TextUtils;  
    12. import android.util.Log;  
    13.   
    14. public class NetTypeActivity extends Activity {  
    15.   
    16.     /** Called when the activity is first created. */  
    17.     public static final String CTWAP = "ctwap";  
    18.     public static final String CTNET = "ctnet";  
    19.     public static final String CMWAP = "cmwap";  
    20.     public static final String CMNET = "cmnet";  
    21.     public static final String NET_3G = "3gnet";  
    22.     public static final String WAP_3G = "3gwap";  
    23.     public static final String UNIWAP = "uniwap";  
    24.     public static final String UNINET = "uninet";  
    25.   
    26.     public static final int TYPE_CT_WAP = 5;  
    27.     public static final int TYPE_CT_NET = 6;  
    28.     public static final int TYPE_CT_WAP_2G = 7;  
    29.     public static final int TYPE_CT_NET_2G = 8;  
    30.   
    31.     public static final int TYPE_CM_WAP = 9;  
    32.     public static final int TYPE_CM_NET = 10;  
    33.     public static final int TYPE_CM_WAP_2G = 11;  
    34.     public static final int TYPE_CM_NET_2G = 12;  
    35.   
    36.     public static final int TYPE_CU_WAP = 13;  
    37.     public static final int TYPE_CU_NET = 14;  
    38.     public static final int TYPE_CU_WAP_2G = 15;  
    39.     public static final int TYPE_CU_NET_2G = 16;  
    40.   
    41.     public static final int TYPE_OTHER = 17;  
    42.   
    43.     public static Uri PREFERRED_APN_URI = Uri  
    44.             .parse("content://telephony/carriers/preferapn");  
    45.   
    46.     /** 没有网络 */  
    47.     public static final int TYPE_NET_WORK_DISABLED = 0;  
    48.   
    49.     /** wifi网络 */  
    50.     public static final int TYPE_WIFI = 4;  
    51.   
    52.     @Override  
    53.     public void onCreate(Bundle savedInstanceState) {  
    54.         super.onCreate(savedInstanceState);  
    55.         setContentView(R.layout.activity_main);  
    56.         long start = System.currentTimeMillis();  
    57.         int checkNetworkType = checkNetworkType(this);  
    58.         Log.i("NetType""===========elpase:"  
    59.                 + (System.currentTimeMillis() - start));  
    60.   
    61.         switch (checkNetworkType) {  
    62.         case TYPE_WIFI:  
    63.             Log.i("NetType""================wifi");  
    64.             break;  
    65.         case TYPE_NET_WORK_DISABLED:  
    66.             Log.i("NetType""================no network");  
    67.             break;  
    68.         case TYPE_CT_WAP:  
    69.             Log.i("NetType""================ctwap");  
    70.             break;  
    71.         case TYPE_CT_WAP_2G:  
    72.             Log.i("NetType""================ctwap_2g");  
    73.             break;  
    74.         case TYPE_CT_NET:  
    75.             Log.i("NetType""================ctnet");  
    76.             break;  
    77.         case TYPE_CT_NET_2G:  
    78.             Log.i("NetType""================ctnet_2g");  
    79.             break;  
    80.         case TYPE_CM_WAP:  
    81.             Log.i("NetType""================cmwap");  
    82.             break;  
    83.         case TYPE_CM_WAP_2G:  
    84.             Log.i("NetType""================cmwap_2g");  
    85.             break;  
    86.         case TYPE_CM_NET:  
    87.             Log.i("NetType""================cmnet");  
    88.             break;  
    89.         case TYPE_CM_NET_2G:  
    90.             Log.i("NetType""================cmnet_2g");  
    91.             break;  
    92.         case TYPE_CU_NET:  
    93.             Log.i("NetType""================cunet");  
    94.             break;  
    95.         case TYPE_CU_NET_2G:  
    96.             Log.i("NetType""================cunet_2g");  
    97.             break;  
    98.         case TYPE_CU_WAP:  
    99.             Log.i("NetType""================cuwap");  
    100.             break;  
    101.         case TYPE_CU_WAP_2G:  
    102.             Log.i("NetType""================cuwap_2g");  
    103.             break;  
    104.         case TYPE_OTHER:  
    105.             Log.i("NetType""================other");  
    106.             break;  
    107.         default:  
    108.             break;  
    109.         }  
    110.     }  
    111.   
    112.     /*** 
    113.      * 判断Network具体类型(联通移动wap,电信wap,其他net) 
    114.      *  
    115.      * */  
    116.     public static int checkNetworkType(Context mContext) {  
    117.         try {  
    118.             final ConnectivityManager connectivityManager = (ConnectivityManager) mContext  
    119.                     .getSystemService(Context.CONNECTIVITY_SERVICE);  
    120.             final NetworkInfo mobNetInfoActivity = connectivityManager  
    121.                     .getActiveNetworkInfo();  
    122.             if (mobNetInfoActivity == null || !mobNetInfoActivity.isAvailable()) {  
    123.                 // 注意一:  
    124.                 // NetworkInfo 为空或者不可以用的时候正常情况应该是当前没有可用网络,  
    125.                 // 但是有些电信机器,仍可以正常联网,  
    126.                 // 所以当成net网络处理依然尝试连接网络。  
    127.                 // (然后在socket中捕捉异常,进行二次判断与用户提示)。  
    128.                 return TYPE_NET_WORK_DISABLED;  
    129.             } else {  
    130.                 // NetworkInfo不为null开始判断是网络类型  
    131.                 int netType = mobNetInfoActivity.getType();  
    132.                 if (netType == ConnectivityManager.TYPE_WIFI) {  
    133.                     // wifi net处理  
    134.                     return TYPE_WIFI;  
    135.                 } else if (netType == ConnectivityManager.TYPE_MOBILE) {  
    136.                     // 注意二:  
    137.                     // 判断是否电信wap:  
    138.                     // 不要通过getExtraInfo获取接入点名称来判断类型,  
    139.                     // 因为通过目前电信多种机型测试发现接入点名称大都为#777或者null,  
    140.                     // 电信机器wap接入点中要比移动联通wap接入点多设置一个用户名和密码,  
    141.                     // 所以可以通过这个进行判断!  
    142.   
    143.                     boolean is3G = isFastMobileNetwork(mContext);  
    144.   
    145.                     final Cursor c = mContext.getContentResolver().query(  
    146.                             PREFERRED_APN_URI, nullnullnullnull);  
    147.                     if (c != null) {  
    148.                         c.moveToFirst();  
    149.                         final String user = c.getString(c  
    150.                                 .getColumnIndex("user"));  
    151.                         if (!TextUtils.isEmpty(user)) {  
    152.                             if (user.startsWith(CTWAP)) {  
    153.                                 return is3G ? TYPE_CT_WAP : TYPE_CT_WAP_2G;  
    154.                             } else if (user.startsWith(CTNET)) {  
    155.                                 return is3G ? TYPE_CT_NET : TYPE_CT_NET_2G;  
    156.                             }  
    157.                         }  
    158.                     }  
    159.                     c.close();  
    160.   
    161.                     // 注意三:  
    162.                     // 判断是移动联通wap:  
    163.                     // 其实还有一种方法通过getString(c.getColumnIndex("proxy")获取代理ip  
    164.                     // 来判断接入点,10.0.0.172就是移动联通wap,10.0.0.200就是电信wap,但在  
    165.                     // 实际开发中并不是所有机器都能获取到接入点代理信息,例如魅族M9 (2.2)等...  
    166.                     // 所以采用getExtraInfo获取接入点名字进行判断  
    167.   
    168.                     String netMode = mobNetInfoActivity.getExtraInfo();  
    169.                     Log.i("""==================netmode:" + netMode);  
    170.                     if (netMode != null) {  
    171.                         // 通过apn名称判断是否是联通和移动wap  
    172.                         netMode = netMode.toLowerCase();  
    173.   
    174.                         if (netMode.equals(CMWAP)) {  
    175.                             return is3G ? TYPE_CM_WAP : TYPE_CM_WAP_2G;  
    176.                         } else if (netMode.equals(CMNET)) {  
    177.                             return is3G ? TYPE_CM_NET : TYPE_CM_NET_2G;  
    178.                         } else if (netMode.equals(NET_3G)  
    179.                                 || netMode.equals(UNINET)) {  
    180.                             return is3G ? TYPE_CU_NET : TYPE_CU_NET_2G;  
    181.                         } else if (netMode.equals(WAP_3G)  
    182.                                 || netMode.equals(UNIWAP)) {  
    183.                             return is3G ? TYPE_CU_WAP : TYPE_CU_WAP_2G;  
    184.                         }  
    185.                     }  
    186.                 }  
    187.             }  
    188.   
    189.         } catch (Exception ex) {  
    190.             ex.printStackTrace();  
    191.             return TYPE_OTHER;  
    192.         }  
    193.   
    194.         return TYPE_OTHER;  
    195.   
    196.     }  
    197.   
    198.     private static boolean isFastMobileNetwork(Context context) {  
    199.         TelephonyManager telephonyManager = (TelephonyManager) context  
    200.                 .getSystemService(Context.TELEPHONY_SERVICE);  
    201.   
    202.         switch (telephonyManager.getNetworkType()) {  
    203.         case TelephonyManager.NETWORK_TYPE_1xRTT:  
    204.             return false// ~ 50-100 kbps  
    205.         case TelephonyManager.NETWORK_TYPE_CDMA:  
    206.             return false// ~ 14-64 kbps  
    207.         case TelephonyManager.NETWORK_TYPE_EDGE:  
    208.             return false// ~ 50-100 kbps  
    209.         case TelephonyManager.NETWORK_TYPE_EVDO_0:  
    210.             return true// ~ 400-1000 kbps  
    211.         case TelephonyManager.NETWORK_TYPE_EVDO_A:  
    212.             return true// ~ 600-1400 kbps  
    213.         case TelephonyManager.NETWORK_TYPE_GPRS:  
    214.             return false// ~ 100 kbps  
    215.         case TelephonyManager.NETWORK_TYPE_HSDPA:  
    216.             return true// ~ 2-14 Mbps  
    217.         case TelephonyManager.NETWORK_TYPE_HSPA:  
    218.             return true// ~ 700-1700 kbps  
    219.         case TelephonyManager.NETWORK_TYPE_HSUPA:  
    220.             return true// ~ 1-23 Mbps  
    221.         case TelephonyManager.NETWORK_TYPE_UMTS:  
    222.             return true// ~ 400-7000 kbps  
    223.         case TelephonyManager.NETWORK_TYPE_EHRPD:  
    224.             return true// ~ 1-2 Mbps  
    225.         case TelephonyManager.NETWORK_TYPE_EVDO_B:  
    226.             return true// ~ 5 Mbps  
    227.         case TelephonyManager.NETWORK_TYPE_HSPAP:  
    228.             return true// ~ 10-20 Mbps  
    229.         case TelephonyManager.NETWORK_TYPE_IDEN:  
    230.             return false// ~25 kbps  
    231.         case TelephonyManager.NETWORK_TYPE_LTE:  
    232.             return true// ~ 10+ Mbps  
    233.         case TelephonyManager.NETWORK_TYPE_UNKNOWN:  
    234.             return false;  
    235.         default:  
    236.             return false;  
    237.   
    238.         }  
    239.     }  
    240.