zoukankan      html  css  js  c++  java
  • 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.   

  • 相关阅读:
    使用VC++生成调试信息
    在Xp home上安装Rose 2003
    SkyDrive注册方法
    vsftpd同时使用系统用户和虚拟用户验证
    如何查看linux系统版本
    在RedHat AS中安装SVN
    Vnc & Gdm
    (转)如何:在设备上安装 SQL Server Compact 3.5
    java培训学习笔记一
    因为此版本的应用程序不支持其项目类型(.csproj),若要打开它,请使用支持此类型项
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/3611315.html
Copyright © 2011-2022 走看看