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

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

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


下一篇:thymeleaf 局部变量、属性优先级、注释