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

来源:互联网 发布:nodejs mysql项目 编辑:程序博客网 时间:2024/04/30 03:48

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

[java] view plaincopy
  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.   
  241. }