网络相关→NetworkUtils

 
   
  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;
  }
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值