安卓开发一般都需要和网络打交道,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断wifi连上了是否可用,那我告诉你,你可以用ping或者访问你们服务端的一个接口查看返回状态,老司机已用ping为你封装了isWifiAvailable,具体可以查看源码,现在为你开车,Demo传送门。
站点
- 网络相关→NetworkUtils.java→Demo
openWirelessSettings : 打开网络设置界面
isConnected : 判断网络是否连接
isAvailableByPing : 判断网络是否可用
getDataEnabled : 判断移动数据是否打开
setDataEnabled : 打开或关闭移动数据
is4G : 判断网络是否是4G
getWifiEnabled : 判断wifi是否打开
setWifiEnabled : 打开或关闭wifi
isWifiConnected : 判断wifi是否连接状态
isWifiAvailable : 判断wifi数据是否可用
getNetworkOperatorName: 获取移动网络运营商名称
getNetworkType : 获取当前网络类型
getIPAddress : 获取IP地址
getDomainAddress : 获取域名ip地址
具体路线
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiInfo;
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.Socket;
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;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
/**
*
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/2
* desc : 网络相关工具类
*
*/
public 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
}
/**
* 打开网络设置界面
* 3.0以下打开设置界面
*/
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));
}
}
/**
* 获取活动网络信息
* 需添加权限 {@code }
*
* @return NetworkInfo
*/
private static NetworkInfo getActiveNetworkInfo() {
ConnectivityManager cm = (ConnectivityManager) Utils.getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* 判断网络是否连接
* 需添加权限 {@code }
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isConnected() {
NetworkInfo info = getActiveNetworkInfo();
return info != null && info.isConnected();
}
/**
* 判断网络是否可用
* 需添加权限 {@code }
*
* @return {@code true}: 可用
{@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}: 是
{@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;
}
/**
* 打开或关闭移动数据
* 需系统应用 需添加权限{@code }
*
* @param enabled {@code true}: 打开
{@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
* 需添加权限 {@code }
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean is4G() {
NetworkInfo info = getActiveNetworkInfo();
return info != null && info.isAvailable() && info.getSubtype() == TelephonyManager.NETWORK_TYPE_LTE;
}
/**
* 判断wifi是否打开
* 需添加权限 {@code }
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean getWifiEnabled() {
WifiManager wifiManager = (WifiManager) Utils.getContext().getSystemService(Context.WIFI_SERVICE);
return wifiManager.isWifiEnabled();
}
/**
* 打开或关闭wifi
* 需添加权限 {@code }
*
* @param enabled {@code true}: 打开
{@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是否连接状态
* 需添加权限 {@code }
*
* @return {@code true}: 连接
{@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数据是否可用
* 需添加权限 {@code }
* 需添加权限 {@code }
*
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isWifiAvailable() {
return getWifiEnabled() && isAvailableByPing();
}
/**
* 获取网络运营商名称
* 中国移动、如中国联通、中国电信
*
* @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;
/**
* 获取当前网络类型
* 需添加权限 {@code }
*
* @return 网络类型
*
* - {@link NetworkUtils.NetworkType#NETWORK_WIFI }
* - {@link NetworkUtils.NetworkType#NETWORK_4G }
* - {@link NetworkUtils.NetworkType#NETWORK_3G }
* - {@link NetworkUtils.NetworkType#NETWORK_2G }
* - {@link NetworkUtils.NetworkType#NETWORK_UNKNOWN}
* - {@link NetworkUtils.NetworkType#NETWORK_NO }
*
*/
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地址
* 需添加权限 {@code }
*
* @param useIPv4 是否用IPv4
* @return IP地址
*/
public static String getIPAddress(boolean useIPv4) {
try {
for (Enumeration nis = NetworkInterface.getNetworkInterfaces(); nis.hasMoreElements(); ) {
NetworkInterface ni = nis.nextElement();
// 防止小米手机返回10.0.2.15
if (!ni.isUp()) continue;
for (Enumeration 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地址
* 需添加权限 {@code }
*
* @param domain 域名
* @return ip地址
*/
public static String getDomainAddress(final String domain) {
try {
ExecutorService exec = Executors.newCachedThreadPool();
Future fs = exec.submit(new Callable() {
@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;
}
}
终点站
好了,终点站到了,如果对本次旅途满意的话,请给五星好评哦,没关注的小伙伴轻轻点个上方的关注,毕竟老司机牺牲了很多时间才换来这么一份工具类,如果该工具类依赖其他工具类,都可以在我的Android开发人员不得不收集的代码(持续更新中)中找到。