import android.content.Context; | |
import android.content.Intent; | |
import android.net.ConnectivityManager; | |
import android.net.NetworkInfo; | |
import android.net.wifi.WifiManager; | |
import android.telephony.TelephonyManager; | |
import java.lang.reflect.Method; | |
import java.net.InetAddress; | |
import java.net.NetworkInterface; | |
import java.net.SocketException; | |
import java.net.UnknownHostException; | |
import java.util.Enumeration; | |
import java.util.concurrent.Callable; | |
import java.util.concurrent.ExecutionException; | |
import java.util.concurrent.ExecutorService; | |
import java.util.concurrent.Executors; | |
import java.util.concurrent.Future; | |
/** | |
* <pre> | |
* author: Blankj | |
* blog : http://blankj.com | |
* time : 2016/8/2 | |
* desc : 网络相关工具类 | |
* </pre> | |
*/ | |
public final class NetworkUtils { | |
private NetworkUtils() { | |
throw new UnsupportedOperationException("u can't instantiate me..."); | |
} | |
public enum NetworkType { | |
NETWORK_WIFI, | |
NETWORK_4G, | |
NETWORK_3G, | |
NETWORK_2G, | |
NETWORK_UNKNOWN, | |
NETWORK_NO | |
} | |
/** | |
* 打开网络设置界面 | |
* <p>3.0以下打开设置界面</p> | |
*/ | |
public static void openWirelessSettings() { | |
if (android.os.Build.VERSION.SDK_INT > 10) { | |
Utils.getContext().startActivity(new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); | |
} else { | |
Utils.getContext().startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS).setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); | |
} | |
} | |
/** | |
* 获取活动网络信息 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p> | |
* | |
* @return NetworkInfo | |
*/ | |
private static NetworkInfo getActiveNetworkInfo() { | |
return ((ConnectivityManager) Utils.getContext().getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo(); | |
} | |
/** | |
* 判断网络是否连接 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p> | |
* | |
* @return {@code true}: 是<br>{@code false}: 否 | |
*/ | |
public static boolean isConnected() { | |
NetworkInfo info = getActiveNetworkInfo(); | |
return info != null && info.isConnected(); | |
} | |
/** | |
* 判断网络是否可用 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> | |
* | |
* @return {@code true}: 可用<br>{@code false}: 不可用 | |
*/ | |
public static boolean isAvailableByPing() { | |
ShellUtils.CommandResult result = ShellUtils.execCmd("ping -c 1 -w 1 223.5.5.5", false); | |
boolean ret = result.result == 0; | |
if (result.errorMsg != null) { | |
LogUtils.d("isAvailableByPing errorMsg", result.errorMsg); | |
} | |
if (result.successMsg != null) { | |
LogUtils.d("isAvailableByPing successMsg", result.successMsg); | |
} | |
return ret; | |
} | |
/** | |
* 判断移动数据是否打开 | |
* | |
* @return {@code true}: 是<br>{@code false}: 否 | |
*/ | |
public static boolean getDataEnabled() { | |
try { | |
TelephonyManager tm = (TelephonyManager) Utils.getContext().getSystemService(Context.TELEPHONY_SERVICE); | |
Method getMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("getDataEnabled"); | |
if (null != getMobileDataEnabledMethod) { | |
return (boolean) getMobileDataEnabledMethod.invoke(tm); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
return false; | |
} | |
/** | |
* 打开或关闭移动数据 | |
* <p>需系统应用 需添加权限{@code <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>}</p> | |
* | |
* @param enabled {@code true}: 打开<br>{@code false}: 关闭 | |
*/ | |
public static void setDataEnabled(boolean enabled) { | |
try { | |
TelephonyManager tm = (TelephonyManager) Utils.getContext().getSystemService(Context.TELEPHONY_SERVICE); | |
Method setMobileDataEnabledMethod = tm.getClass().getDeclaredMethod("setDataEnabled", boolean.class); | |
if (null != setMobileDataEnabledMethod) { | |
setMobileDataEnabledMethod.invoke(tm, enabled); | |
} | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
} | |
/** | |
* 判断网络是否是4G | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p> | |
* | |
* @return {@code true}: 是<br>{@code false}: 否 | |
*/ | |
public static boolean is4G() { | |
NetworkInfo info = getActiveNetworkInfo(); | |
return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE; | |
} | |
/** | |
* 判断wifi是否打开 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> | |
* | |
* @return {@code true}: 是<br>{@code false}: 否 | |
*/ | |
public static boolean getWifiEnabled() { | |
WifiManager wifiManager = (WifiManager) Utils.getContext().getSystemService(Context.WIFI_SERVICE); | |
return wifiManager.isWifiEnabled(); | |
} | |
/** | |
* 打开或关闭wifi | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>}</p> | |
* | |
* @param enabled {@code true}: 打开<br>{@code false}: 关闭 | |
*/ | |
public static void setWifiEnabled(boolean enabled) { | |
WifiManager wifiManager = (WifiManager) Utils.getContext().getSystemService(Context.WIFI_SERVICE); | |
if (enabled) { | |
if (!wifiManager.isWifiEnabled()) { | |
wifiManager.setWifiEnabled(true); | |
} | |
} else { | |
if (wifiManager.isWifiEnabled()) { | |
wifiManager.setWifiEnabled(false); | |
} | |
} | |
} | |
/** | |
* 判断wifi是否连接状态 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p> | |
* | |
* @return {@code true}: 连接<br>{@code false}: 未连接 | |
*/ | |
public static boolean isWifiConnected() { | |
ConnectivityManager cm = (ConnectivityManager) Utils.getContext() | |
.getSystemService(Context.CONNECTIVITY_SERVICE); | |
return cm != null && cm.getActiveNetworkInfo() != null | |
&& cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI; | |
} | |
/** | |
* 判断wifi数据是否可用 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p> | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> | |
* | |
* @return {@code true}: 是<br>{@code false}: 否 | |
*/ | |
public static boolean isWifiAvailable() { | |
return getWifiEnabled() && isAvailableByPing(); | |
} | |
/** | |
* 获取网络运营商名称 | |
* <p>中国移动、如中国联通、中国电信</p> | |
* | |
* @return 运营商名称 | |
*/ | |
public static String getNetworkOperatorName() { | |
TelephonyManager tm = (TelephonyManager) Utils.getContext().getSystemService(Context.TELEPHONY_SERVICE); | |
return tm != null ? tm.getNetworkOperatorName() : null; | |
} | |
private static final int NETWORK_TYPE_GSM = 16; | |
private static final int NETWORK_TYPE_TD_SCDMA = 17; | |
private static final int NETWORK_TYPE_IWLAN = 18; | |
/** | |
* 获取当前网络类型 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p> | |
* | |
* @return 网络类型 | |
* <ul> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_WIFI } </li> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_4G } </li> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_3G } </li> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_2G } </li> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_UNKNOWN} </li> | |
* <li>{@link NetworkUtils.NetworkType#NETWORK_NO } </li> | |
* </ul> | |
*/ | |
public static NetworkType getNetworkType() { | |
NetworkType netType = NetworkType.NETWORK_NO; | |
NetworkInfo info = getActiveNetworkInfo(); | |
if (info != null && info.isAvailable()) { | |
if (info.getType() == ConnectivityManager.TYPE_WIFI) { | |
netType = NetworkType.NETWORK_WIFI; | |
} else if (info.getType() == ConnectivityManager.TYPE_MOBILE) { | |
switch (info.getSubtype()) { | |
case NETWORK_TYPE_GSM: | |
case TelephonyManager.NETWORK_TYPE_GPRS: | |
case TelephonyManager.NETWORK_TYPE_CDMA: | |
case TelephonyManager.NETWORK_TYPE_EDGE: | |
case TelephonyManager.NETWORK_TYPE_1xRTT: | |
case TelephonyManager.NETWORK_TYPE_IDEN: | |
netType = NetworkType.NETWORK_2G; | |
break; | |
case NETWORK_TYPE_TD_SCDMA: | |
case TelephonyManager.NETWORK_TYPE_EVDO_A: | |
case TelephonyManager.NETWORK_TYPE_UMTS: | |
case TelephonyManager.NETWORK_TYPE_EVDO_0: | |
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: | |
netType = NetworkType.NETWORK_3G; | |
break; | |
case NETWORK_TYPE_IWLAN: | |
case TelephonyManager.NETWORK_TYPE_LTE: | |
netType = NetworkType.NETWORK_4G; | |
break; | |
default: | |
String subtypeName = info.getSubtypeName(); | |
if (subtypeName.equalsIgnoreCase("TD-SCDMA") | |
|| subtypeName.equalsIgnoreCase("WCDMA") | |
|| subtypeName.equalsIgnoreCase("CDMA2000")) { | |
netType = NetworkType.NETWORK_3G; | |
} else { | |
netType = NetworkType.NETWORK_UNKNOWN; | |
} | |
break; | |
} | |
} else { | |
netType = NetworkType.NETWORK_UNKNOWN; | |
} | |
} | |
return netType; | |
} | |
/** | |
* 获取IP地址 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> | |
* | |
* @param useIPv4 是否用IPv4 | |
* @return IP地址 | |
*/ | |
public static String getIPAddress(boolean useIPv4) { | |
try { | |
for (Enumeration<NetworkInterface> nis = NetworkInterface.getNetworkInterfaces(); nis.hasMoreElements(); ) { | |
NetworkInterface ni = nis.nextElement(); | |
// 防止小米手机返回10.0.2.15 | |
if (!ni.isUp()) continue; | |
for (Enumeration<InetAddress> addresses = ni.getInetAddresses(); addresses.hasMoreElements(); ) { | |
InetAddress inetAddress = addresses.nextElement(); | |
if (!inetAddress.isLoopbackAddress()) { | |
String hostAddress = inetAddress.getHostAddress(); | |
boolean isIPv4 = hostAddress.indexOf(':') < 0; | |
if (useIPv4) { | |
if (isIPv4) return hostAddress; | |
} else { | |
if (!isIPv4) { | |
int index = hostAddress.indexOf('%'); | |
return index < 0 ? hostAddress.toUpperCase() : hostAddress.substring(0, index).toUpperCase(); | |
} | |
} | |
} | |
} | |
} | |
} catch (SocketException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
/** | |
* 获取域名ip地址 | |
* <p>需添加权限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p> | |
* | |
* @param domain 域名 | |
* @return ip地址 | |
*/ | |
public static String getDomainAddress(final String domain) { | |
try { | |
ExecutorService exec = Executors.newCachedThreadPool(); | |
Future<String> fs = exec.submit(new Callable<String>() { | |
@Override | |
public String call() throws Exception { | |
InetAddress inetAddress; | |
try { | |
inetAddress = InetAddress.getByName(domain); | |
return inetAddress.getHostAddress(); | |
} catch (UnknownHostException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
}); | |
return fs.get(); | |
} catch (InterruptedException | ExecutionException e) { | |
e.printStackTrace(); | |
} | |
return null; | |
} | |
} |