Android中獲取網路狀態的getConnectivityManager
阿新 • • 發佈:2019-01-03
在獲取網路狀態前記得加上此許可權:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
工具類如下:
public class NetworkUtil { private static final String TAG = NetworkUtil.class.getSimpleName(); public enum NetType { None(1), Mobile(2), Wifi(4), Other(8); NetType(int value) { this.value = value; } public int value; } public enum NetWorkType { UnKnown(-1), Wifi(1), Net2G(2), Net3G(3), Net4G(4); NetWorkType(int value) { this.value = value; } public int value; } /** * 開啟網路設定介面 * <p>3.0以下開啟設定介面</p> * * @param context 上下文 */ public static void openWirelessSettings(Context context) { if (android.os.Build.VERSION.SDK_INT > 10) { context.startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS)); } else { context.startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)); } } /** * 獲取ConnectivityManager */ public static ConnectivityManager getConnectivityManager(Context context) { return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); } /** * 獲取TelephonyManager */ public static TelephonyManager getTelephonyManager(Context context) { return (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); } /** * 判斷網路連線是否有效(此時可傳輸資料)。 * * @return boolean 不管wifi,還是mobile net,只有當前在連線狀態(可有效傳輸資料)才返回true,反之false。 */ public static boolean isConnected(Context context) { NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo(); return net != null && net.isConnected(); } /** * 判斷有無網路正在連線中(查詢網路、校驗、獲取IP等)。 * * @return boolean 不管wifi,還是mobile net,只有當前在連線狀態(可有效傳輸資料)才返回true,反之false。 */ public static boolean isConnectedOrConnecting(Context context) { NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo(); if (nets != null) { for (NetworkInfo net : nets) { if (net.isConnectedOrConnecting()) { return true; } } } return false; } public static NetType getConnectedType(Context context) { NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo(); if (net != null) { switch (net.getType()) { case ConnectivityManager.TYPE_WIFI: return NetType.Wifi; case ConnectivityManager.TYPE_MOBILE: return NetType.Mobile; default: return NetType.Other; } } return NetType.None; } /** * 是否存在有效的WIFI連線 */ public static boolean isWifiConnected(Context context) { NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo(); return net != null && net.getType() == ConnectivityManager.TYPE_WIFI && net.isConnected(); } /** * 是否存在有效的移動連線 * * @return boolean */ public static boolean isMobileConnected(Context context) { NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo(); return net != null && net.getType() == ConnectivityManager.TYPE_MOBILE && net.isConnected(); } /** * 檢測網路是否為可用狀態 */ public static boolean isAvailable(Context context) { return isWifiAvailable(context) || (isMobileAvailable(context) && isMobileEnabled(context)); } /** * 判斷是否有可用狀態的Wifi,以下情況返回false: * 1. 裝置wifi開關關掉; * 2. 已經開啟飛航模式; * 3. 裝置所在區域沒有訊號覆蓋; * 4. 裝置在漫遊區域,且關閉了網路漫遊。 * * @return boolean wifi為可用狀態(不一定成功連線,即Connected)即返回ture */ public static boolean isWifiAvailable(Context context) { NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo(); if (nets != null) { for (NetworkInfo net : nets) { if (net.getType() == ConnectivityManager.TYPE_WIFI) { return net.isAvailable(); } } } return false; } /** * 判斷有無可用狀態的行動網路,注意關掉裝置行動網路直接不影響此函式。 * 也就是即使關掉行動網路,那麼行動網路也可能是可用的(彩信等服務),即返回true。 * 以下情況它是不可用的,將返回false: * 1. 裝置開啟飛航模式; * 2. 裝置所在區域沒有訊號覆蓋; * 3. 裝置在漫遊區域,且關閉了網路漫遊。 * * @return boolean */ public static boolean isMobileAvailable(Context context) { NetworkInfo[] nets = getConnectivityManager(context).getAllNetworkInfo(); if (nets != null) { for (NetworkInfo net : nets) { if (net.getType() == ConnectivityManager.TYPE_MOBILE) { return net.isAvailable(); } } } return false; } /** * 裝置是否開啟行動網路開關 * * @return boolean 開啟行動網路返回true,反之false */ public static boolean isMobileEnabled(Context context) { try { Method getMobileDataEnabledMethod = ConnectivityManager.class.getDeclaredMethod("getMobileDataEnabled"); getMobileDataEnabledMethod.setAccessible(true); return (Boolean) getMobileDataEnabledMethod.invoke(getConnectivityManager(context)); } catch (Exception e) { e.printStackTrace(); } // 反射失敗,預設開啟 return true; } /** * 列印當前各種網路狀態 * * @return boolean */ public static boolean printNetworkInfo(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo in = connectivity.getActiveNetworkInfo(); Log.i(TAG, "-------------$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$-------------"); Log.i(TAG, "getActiveNetworkInfo: " + in); NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { // if (info[i].getType() == ConnectivityManager.TYPE_WIFI) { Log.i(TAG, "NetworkInfo[" + i + "]isAvailable : " + info[i].isAvailable()); Log.i(TAG, "NetworkInfo[" + i + "]isConnected : " + info[i].isConnected()); Log.i(TAG, "NetworkInfo[" + i + "]isConnectedOrConnecting : " + info[i].isConnectedOrConnecting()); Log.i(TAG, "NetworkInfo[" + i + "]: " + info[i]); // } } Log.i(TAG, "\n"); } else { Log.i(TAG, "getAllNetworkInfo is null"); } } return false; } /** * get connected network type by {@link ConnectivityManager} * * such as WIFI, MOBILE, ETHERNET, BLUETOOTH, etc. * * @return {@link ConnectivityManager#TYPE_WIFI}, {@link ConnectivityManager#TYPE_MOBILE}, * {@link ConnectivityManager#TYPE_ETHERNET}... */ public static int getConnectedTypeINT(Context context) { NetworkInfo net = getConnectivityManager(context).getActiveNetworkInfo(); if (net != null) { Log.i(TAG, "NetworkInfo: " + net.toString()); return net.getType(); } return -1; } /** * get network type by {@link TelephonyManager} * * such as 2G, 3G, 4G, etc. * * @return {@link TelephonyManager#NETWORK_TYPE_CDMA}, {@link TelephonyManager#NETWORK_TYPE_GPRS}, * {@link TelephonyManager#NETWORK_TYPE_LTE}... */ public static int getTelNetworkTypeINT(Context context) { return getTelephonyManager(context).getNetworkType(); } /** * 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 快些 * 備註:在網路狀態變化時這個獲取的貌似不是很準確,有空除錯下... * @return {@link NetWorkType} */ public static NetWorkType getNetworkType(Context context) { int type = getConnectedTypeINT(context); switch (type) { case ConnectivityManager.TYPE_WIFI: return NetWorkType.Wifi; case ConnectivityManager.TYPE_MOBILE: case ConnectivityManager.TYPE_MOBILE_DUN: case ConnectivityManager.TYPE_MOBILE_HIPRI: case ConnectivityManager.TYPE_MOBILE_MMS: case ConnectivityManager.TYPE_MOBILE_SUPL: int teleType = getTelephonyManager(context).getNetworkType(); switch (teleType) { 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 NetWorkType.Net2G; 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 NetWorkType.Net3G; case TelephonyManager.NETWORK_TYPE_LTE: return NetWorkType.Net4G; default: return NetWorkType.UnKnown; } default: return NetWorkType.UnKnown; } } }