package com.github.lazylibrary.util; import android.annotation.TargetApi; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.wifi.WifiManager; import android.os.Build; import android.telephony.TelephonyManager; import android.text.TextUtils; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.util.Enumeration; public class NetWorkUtils { /** * 网络类型 - 无连接 */ public static final int NETWORK_TYPE_NO_CONNECTION = -1231545315; public static final String NETWORK_TYPE_WIFI = "wifi"; public static final String NETWORK_TYPE_3G = "eg"; public static final String NETWORK_TYPE_2G = "2g"; public static final String NETWORK_TYPE_WAP = "wap"; public static final String NETWORK_TYPE_UNKNOWN = "unknown"; public static final String NETWORK_TYPE_DISCONNECT = "disconnect"; /** * Get network type * * @param context context * @return 网络状态 */ public static int getNetworkType(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager == null ? null : connectivityManager.getActiveNetworkInfo(); return networkInfo == null ? -1 : networkInfo.getType(); } /** * Get network type name * * @param context context * @return NetworkTypeName */ public static String getNetworkTypeName(Context context) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo; String type = NETWORK_TYPE_DISCONNECT; if (manager == null || (networkInfo = manager.getActiveNetworkInfo()) == null) { return type; } ; if (networkInfo.isConnected()) { String typeName = networkInfo.getTypeName(); if ("WIFI".equalsIgnoreCase(typeName)) { type = NETWORK_TYPE_WIFI; } else if ("MOBILE".equalsIgnoreCase(typeName)) { String proxyHost = android.net.Proxy.getDefaultHost(); type = TextUtils.isEmpty(proxyHost) ? (isFastMobileNetwork(context) ? NETWORK_TYPE_3G : NETWORK_TYPE_2G) : NETWORK_TYPE_WAP; } else { type = NETWORK_TYPE_UNKNOWN; } } return type; } /** * Whether is fast mobile network * * @param context context * @return FastMobileNetwork */ private static boolean isFastMobileNetwork(Context context) { TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService( Context.TELEPHONY_SERVICE); if (telephonyManager == null) { return false; } switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_1xRTT: return false; case TelephonyManager.NETWORK_TYPE_CDMA: return false; case TelephonyManager.NETWORK_TYPE_EDGE: return false; case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; case TelephonyManager.NETWORK_TYPE_GPRS: return false; case TelephonyManager.NETWORK_TYPE_HSDPA: return true; case TelephonyManager.NETWORK_TYPE_HSPA: return true; case TelephonyManager.NETWORK_TYPE_HSUPA: return true; case TelephonyManager.NETWORK_TYPE_UMTS: return true; case TelephonyManager.NETWORK_TYPE_EHRPD: return true; case TelephonyManager.NETWORK_TYPE_EVDO_B: return true; case TelephonyManager.NETWORK_TYPE_HSPAP: return true; case TelephonyManager.NETWORK_TYPE_IDEN: return false; case TelephonyManager.NETWORK_TYPE_LTE: return true; case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false; default: return false; } } /** * 获取当前网络的状态 * * @param context 上下文 * @return 当前网络的状态。具体类型可参照NetworkInfo.State.CONNECTED、NetworkInfo.State.CONNECTED.DISCONNECTED等字段。当前没有网络连接时返回null */ public static NetworkInfo.State getCurrentNetworkState(Context context) { NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return networkInfo != null ? networkInfo.getState() : null; } /** * 获取当前网络的类型 * * @param context 上下文 * @return 当前网络的类型。具体类型可参照ConnectivityManager中的TYPE_BLUETOOTH、TYPE_MOBILE、TYPE_WIFI等字段。当前没有网络连接时返回NetworkUtils.NETWORK_TYPE_NO_CONNECTION */ public static int getCurrentNetworkType(Context context) { NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return networkInfo != null ? networkInfo.getType() : NETWORK_TYPE_NO_CONNECTION; } /** * 获取当前网络的具体类型 * * @param context 上下文 * @return 当前网络的具体类型。具体类型可参照TelephonyManager中的NETWORK_TYPE_1xRTT、NETWORK_TYPE_CDMA等字段。当前没有网络连接时返回NetworkUtils.NETWORK_TYPE_NO_CONNECTION */ public static int getCurrentNetworkSubtype(Context context) { NetworkInfo networkInfo = ((ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); return networkInfo != null ? networkInfo.getSubtype() : NETWORK_TYPE_NO_CONNECTION; } /** * 判断当前网络是否已经连接 * * @param context 上下文 * @return 当前网络是否已经连接。false:尚未连接 */ public static boolean isConnectedByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.CONNECTED; } /** * 判断当前网络是否正在连接 * * @param context 上下文 * @return 当前网络是否正在连接 */ public static boolean isConnectingByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.CONNECTING; } /** * 判断当前网络是否已经断开 * * @param context 上下文 * @return 当前网络是否已经断开 */ public static boolean isDisconnectedByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.DISCONNECTED; } /** * 判断当前网络是否正在断开 * * @param context 上下文 * @return 当前网络是否正在断开 */ public static boolean isDisconnectingByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.DISCONNECTING; } /** * 判断当前网络是否已经暂停 * * @param context 上下文 * @return 当前网络是否已经暂停 */ public static boolean isSuspendedByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.SUSPENDED; } /** * 判断当前网络是否处于未知状态中 * * @param context 上下文 * @return 当前网络是否处于未知状态中 */ public static boolean isUnknownByState(Context context) { return getCurrentNetworkState(context) == NetworkInfo.State.UNKNOWN; } /** * 判断当前网络的类型是否是蓝牙 * * @param context 上下文 * @return 当前网络的类型是否是蓝牙。false:当前没有网络连接或者网络类型不是蓝牙 */ @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public static boolean isBluetoothByType(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) { return false; } else { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_BLUETOOTH; } } /** * 判断当前网络的类型是否是虚拟网络 * * @param context 上下文 * @return 当前网络的类型是否是虚拟网络。false:当前没有网络连接或者网络类型不是虚拟网络 */ @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public static boolean isDummyByType(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) { return false; } else { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_DUMMY; } } /** * 判断当前网络的类型是否是ETHERNET * * @param context 上下文 * @return 当前网络的类型是否是ETHERNET。false:当前没有网络连接或者网络类型不是ETHERNET */ @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public static boolean isEthernetByType(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) { return false; } else { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_ETHERNET; } } /** * 判断当前网络的类型是否是移动网络 * * @param context 上下文 * @return 当前网络的类型是否是移动网络。false:当前没有网络连接或者网络类型不是移动网络 */ public static boolean isMobileByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_MOBILE; } /** * 判断当前网络的类型是否是MobileDun * * @param context 上下文 * @return 当前网络的类型是否是MobileDun。false:当前没有网络连接或者网络类型不是MobileDun */ public static boolean isMobileDunByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_MOBILE_DUN; } /** * 判断当前网络的类型是否是MobileHipri * * @param context 上下文 * @return 当前网络的类型是否是MobileHipri。false:当前没有网络连接或者网络类型不是MobileHipri */ public static boolean isMobileHipriByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_MOBILE_HIPRI; } /** * 判断当前网络的类型是否是MobileMms * * @param context 上下文 * @return 当前网络的类型是否是MobileMms。false:当前没有网络连接或者网络类型不是MobileMms */ public static boolean isMobileMmsByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_MOBILE_MMS; } /** * 判断当前网络的类型是否是MobileSupl * * @param context 上下文 * @return 当前网络的类型是否是MobileSupl。false:当前没有网络连接或者网络类型不是MobileSupl */ public static boolean isMobileSuplByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_MOBILE_SUPL; } /** * 判断当前网络的类型是否是Wifi * * @param context 上下文 * @return 当前网络的类型是否是Wifi。false:当前没有网络连接或者网络类型不是wifi */ public static boolean isWifiByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_WIFI; } /** * 判断当前网络的类型是否是Wimax * * @param context 上下文 * @return 当前网络的类型是否是Wimax。false:当前没有网络连接或者网络类型不是Wimax */ public static boolean isWimaxByType(Context context) { return getCurrentNetworkType(context) == ConnectivityManager.TYPE_WIMAX; } /** * 判断当前网络的具体类型是否是1XRTT * * @param context 上下文 * @return false:当前网络的具体类型是否是1XRTT。false:当前没有网络连接或者具体类型不是1XRTT */ public static boolean is1XRTTBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_1xRTT; } /** * 判断当前网络的具体类型是否是CDMA(Either IS95A or IS95B) * * @param context 上下文 * @return false:当前网络的具体类型是否是CDMA。false:当前没有网络连接或者具体类型不是CDMA */ public static boolean isCDMABySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_CDMA; } /** * 判断当前网络的具体类型是否是EDGE * * @param context 上下文 * @return false:当前网络的具体类型是否是EDGE。false:当前没有网络连接或者具体类型不是EDGE */ public static boolean isEDGEBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_EDGE; } /** * 判断当前网络的具体类型是否是EHRPD * * @param context 上下文 * @return false:当前网络的具体类型是否是EHRPD。false:当前没有网络连接或者具体类型不是EHRPD */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static boolean isEHRPDBySubtype(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return false; } else { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_EHRPD; } } /** * 判断当前网络的具体类型是否是EVDO_0 * * @param context 上下文 * @return false:当前网络的具体类型是否是EVDO_0。false:当前没有网络连接或者具体类型不是EVDO_0 */ public static boolean isEVDO_0BySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_EVDO_0; } /** * 判断当前网络的具体类型是否是EVDO_A * * @param context 上下文 * @return false:当前网络的具体类型是否是EVDO_A。false:当前没有网络连接或者具体类型不是EVDO_A */ public static boolean isEVDO_ABySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_EVDO_A; } /** * 判断当前网络的具体类型是否是EDGE * * @param context 上下文 * @return false:当前网络的具体类型是否是EVDO_B。false:当前没有网络连接或者具体类型不是EVDO_B */ @TargetApi(Build.VERSION_CODES.GINGERBREAD) public static boolean isEVDO_BBySubtype(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.GINGERBREAD) { return false; } else { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_EVDO_B; } } /** * 判断当前网络的具体类型是否是GPRS * EVDO_Bam context 上下文 * * @return false:当前网络的具体类型是否是GPRS。false:当前没有网络连接或者具体类型不是GPRS */ public static boolean isGPRSBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_GPRS; } /** * 判断当前网络的具体类型是否是HSDPA * * @param context 上下文 * @return false:当前网络的具体类型是否是HSDPA。false:当前没有网络连接或者具体类型不是HSDPA */ public static boolean isHSDPABySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_HSDPA; } /** * 判断当前网络的具体类型是否是HSPA * * @param context 上下文 * @return false:当前网络的具体类型是否是HSPA。false:当前没有网络连接或者具体类型不是HSPA */ public static boolean isHSPABySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_HSPA; } /** * 判断当前网络的具体类型是否是HSPAP * * @param context 上下文 * @return false:当前网络的具体类型是否是HSPAP。false:当前没有网络连接或者具体类型不是HSPAP */ @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2) public static boolean isHSPAPBySubtype(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB_MR2) { return false; } else { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_HSPAP; } } /** * 判断当前网络的具体类型是否是HSUPA * * @param context 上下文 * @return false:当前网络的具体类型是否是HSUPA。false:当前没有网络连接或者具体类型不是HSUPA */ public static boolean isHSUPABySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_HSUPA; } /** * 判断当前网络的具体类型是否是IDEN * * @param context 上下文 * @return false:当前网络的具体类型是否是IDEN。false:当前没有网络连接或者具体类型不是IDEN */ public static boolean isIDENBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_IDEN; } /** * 判断当前网络的具体类型是否是LTE * * @param context 上下文 * @return false:当前网络的具体类型是否是LTE。false:当前没有网络连接或者具体类型不是LTE */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static boolean isLTEBySubtype(Context context) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { return false; } else { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_LTE; } } /** * 判断当前网络的具体类型是否是UMTS * * @param context 上下文 * @return false:当前网络的具体类型是否是UMTS。false:当前没有网络连接或者具体类型不是UMTS */ public static boolean isUMTSBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_UMTS; } /** * 判断当前网络的具体类型是否是UNKNOWN * * @param context 上下文 * @return false:当前网络的具体类型是否是UNKNOWN。false:当前没有网络连接或者具体类型不是UNKNOWN */ public static boolean isUNKNOWNBySubtype(Context context) { return getCurrentNetworkSubtype(context) == TelephonyManager.NETWORK_TYPE_UNKNOWN; } /** * 判断当前网络是否是中国移动2G网络 * * @param context 上下文 * @return false:不是中国移动2G网络或者当前没有网络连接 */ public static boolean isChinaMobile2G(Context context) { return isEDGEBySubtype(context); } /** * 判断当前网络是否是中国联通2G网络 * * @param context 上下文 * @return false:不是中国联通2G网络或者当前没有网络连接 */ public static boolean isChinaUnicom2G(Context context) { return isGPRSBySubtype(context); } /** * 判断当前网络是否是中国联通3G网络 * * @param context 上下文 * @return false:不是中国联通3G网络或者当前没有网络连接 */ public static boolean isChinaUnicom3G(Context context) { return isHSDPABySubtype(context) || isUMTSBySubtype(context); } /** * 判断当前网络是否是中国电信2G网络 * * @param context 上下文 * @return false:不是中国电信2G网络或者当前没有网络连接 */ public static boolean isChinaTelecom2G(Context context) { return isCDMABySubtype(context); } /** * 判断当前网络是否是中国电信3G网络 * * @param context 上下文 * @return false:不是中国电信3G网络或者当前没有网络连接 */ public static boolean isChinaTelecom3G(Context context) { return isEVDO_0BySubtype(context) || isEVDO_ABySubtype(context) || isEVDO_BBySubtype(context); } /** * 获取Wifi的状态,需要ACCESS_WIFI_STATE权限 * * @param context 上下文 * @return 取值为WifiManager中的WIFI_STATE_ENABLED、WIFI_STATE_ENABLING、WIFI_STATE_DISABLED、WIFI_STATE_DISABLING、WIFI_STATE_UNKNOWN之一 * @throws Exception 没有找到wifi设备 */ public static int getWifiState(Context context) throws Exception { WifiManager wifiManager = ((WifiManager) context.getSystemService( Context.WIFI_SERVICE)); if (wifiManager != null) { return wifiManager.getWifiState(); } else { throw new Exception("wifi device not found!"); } } /** * 判断Wifi是否打开,需要ACCESS_WIFI_STATE权限 * * @param context 上下文 * @return true:打开;false:关闭 */ public static boolean isWifiOpen(Context context) throws Exception { int wifiState = getWifiState(context); return wifiState == WifiManager.WIFI_STATE_ENABLED || wifiState == WifiManager.WIFI_STATE_ENABLING ? true : false; } /** * 设置Wifi,需要CHANGE_WIFI_STATE权限 * * @param context 上下文 * @param enable wifi状态 * @return 设置是否成功 */ public static boolean setWifi(Context context, boolean enable) throws Exception { //如果当前wifi的状态和要设置的状态不一样 if (isWifiOpen(context) != enable) { ((WifiManager) context.getSystemService( Context.WIFI_SERVICE)).setWifiEnabled(enable); } return true; } /** * 判断移动网络是否打开,需要ACCESS_NETWORK_STATE权限 * * @param context 上下文 * @return true:打开;false:关闭 */ public static boolean isMobileNetworkOpen(Context context) { return (((ConnectivityManager) context.getSystemService( Context.CONNECTIVITY_SERVICE)).getNetworkInfo( ConnectivityManager.TYPE_MOBILE)).isConnected(); } /** * 获取本机IP地址 * * @return null:没有网络连接 */ public static String getIpAddress() { try { NetworkInterface nerworkInterface; InetAddress inetAddress; for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { nerworkInterface = en.nextElement(); for (Enumeration enumIpAddr = nerworkInterface.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } return null; } catch (SocketException ex) { ex.printStackTrace(); return null; } } }