安卓開發(fā)一般都需要和網(wǎng)絡(luò)打交道,常用操作老司機已為你封裝完畢摊溶,經(jīng)常有小伙伴問怎么判斷wifi連上了是否可用莫换,那我告訴你骤铃,你可以用ping或者訪問你們服務(wù)端的一個接口查看返回狀態(tài),老司機已用ping為你封裝了isWifiAvailable喊暖,具體可以查看源碼陵叽,現(xiàn)在為你開車丛版,Demo傳送門。
站點
- 網(wǎng)絡(luò)相關(guān)→NetworkUtils.java→Demo
openWirelessSettings : 打開網(wǎng)絡(luò)設(shè)置界面
isConnected : 判斷網(wǎng)絡(luò)是否連接
isAvailableByPing : 判斷網(wǎng)絡(luò)是否可用
getDataEnabled : 判斷移動數(shù)據(jù)是否打開
setDataEnabled : 打開或關(guān)閉移動數(shù)據(jù)
is4G : 判斷網(wǎng)絡(luò)是否是4G
getWifiEnabled : 判斷wifi是否打開
setWifiEnabled : 打開或關(guān)閉wifi
isWifiConnected : 判斷wifi是否連接狀態(tài)
isWifiAvailable : 判斷wifi數(shù)據(jù)是否可用
getNetworkOperatorName: 獲取移動網(wǎng)絡(luò)運營商名稱
getNetworkType : 獲取當(dāng)前網(wǎng)絡(luò)類型
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;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/8/2
* desc : 網(wǎng)絡(luò)相關(guān)工具類
* </pre>
*/
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
}
/**
* 打開網(wǎng)絡(luò)設(shè)置界面
* <p>3.0以下打開設(shè)置界面</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));
}
}
/**
* 獲取活動網(wǎng)絡(luò)信息
* <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p>
*
* @return NetworkInfo
*/
private static NetworkInfo getActiveNetworkInfo() {
ConnectivityManager cm = (ConnectivityManager) Utils.getContext()
.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* 判斷網(wǎng)絡(luò)是否連接
* <p>需添加權(quán)限 {@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();
}
/**
* 判斷網(wǎng)絡(luò)是否可用
* <p>需添加權(quán)限 {@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;
}
/**
* 判斷移動數(shù)據(jù)是否打開
*
* @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;
}
/**
* 打開或關(guān)閉移動數(shù)據(jù)
* <p>需系統(tǒng)應(yīng)用 需添加權(quán)限{@code <uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/>}</p>
*
* @param enabled {@code true}: 打開<br>{@code false}: 關(guān)閉
*/
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();
}
}
/**
* 判斷網(wǎng)絡(luò)是否是4G
* <p>需添加權(quán)限 {@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>需添加權(quán)限 {@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();
}
/**
* 打開或關(guān)閉wifi
* <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>}</p>
*
* @param enabled {@code true}: 打開<br>{@code false}: 關(guān)閉
*/
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是否連接狀態(tài)
* <p>需添加權(quán)限 {@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數(shù)據(jù)是否可用
* <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>}</p>
* <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.INTERNET"/>}</p>
*
* @return {@code true}: 是<br>{@code false}: 否
*/
public static boolean isWifiAvailable() {
return getWifiEnabled() && isAvailableByPing();
}
/**
* 獲取網(wǎng)絡(luò)運營商名稱
* <p>中國移動、如中國聯(lián)通逸月、中國電信</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;
/**
* 獲取當(dāng)前網(wǎng)絡(luò)類型
* <p>需添加權(quán)限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}</p>
*
* @return 網(wǎng)絡(luò)類型
* <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>需添加權(quán)限 {@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>需添加權(quán)限 {@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;
}
}
終點站
好了,終點站到了挽懦,如果對本次旅途滿意的話木人,請給五星好評哦,沒關(guān)注的小伙伴輕輕點個上方的關(guān)注渔嚷,畢竟老司機犧牲了很多時間才換來這么一份工具類稠曼,如果該工具類依賴其他工具類,都可以在我的Android開發(fā)人員不得不收集的代碼(持續(xù)更新中)中找到漠吻。