本篇文章主要记录下Android下设备网络相关的一些信息以及获取方法.
1: 当前网络连接状态
ConnectivityManager是Android平台上的一个系统服务,用于管理网络连接。
它提供了一组API,用于检测和控制设备的网络连接状态。
ConnectivityManager可以帮助应用程序监测网络连接的可用性,并根据需要切换网络连接。
getActiveNetworkInfo(): 获取当前活动的网络连接信息. 该方法需要申请权限:
android.Manifest.permission.ACCESS_NETWORK_STATE
具体的方法如下:
public static final int CONNECT_NET_NONE = 0;
public static final int CONNECT_NET_WIFI = 1;
public static final int CONNECT_NET_MOBILE = 2;
/**
* @return 当前连接的网络类型
* request ACCESS_NETWORK_STATE
*/
public static int getConnectNetType(Context context) {
if (context == null) {
return CONNECT_NET_NONE;
}
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager == null) {
return CONNECT_NET_NONE;
}
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isAvailable()) {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
if (networkInfo == null) {
return CONNECT_NET_WIFI;
}
NetworkInfo.State state = networkInfo.getState();
if (state == NetworkInfo.State.CONNECTED) {
return CONNECT_NET_MOBILE;
} else {
return CONNECT_NET_WIFI;
}
}
return CONNECT_NET_NONE;
}
2:判断当前是否联网
判断是否联网的方法还是用到了connectivityManager.getActiveNetworkInfo()方法.
根据获取到的NetworkInfo我们调用isAvailable();
封装的方法如下:
/**
* @return 当前网络是否连接
* request ACCESS_NETWORK_STATE
*/
public static boolean isNetConnected(Context context) {
if (context == null) {
return false;
}
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo info = connectivityManager.getActiveNetworkInfo();
return info != null && info.isAvailable();
}
return false;
}
3:获取移动网络下ip地址
获取移动网络下的ip地址具体的思路如下:
- NetworkInterface.getNetworkInterfaces():获取当前主机上所有网络接口的列表.
- networkInterface.getInetAddresses():获取网络接口的所有IP地址
- format()方法用于格式化ip.
/**
* @return
* request android.permission.INTERNET
*/
public static String getMobileIp() {
try {
Enumeration en = NetworkInterface.getNetworkInterfaces();
if (en == null) {
return “”;
}
for (en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) {
NetworkInterface networkInterface = en.nextElement();
if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) {
continue;
}
InetAddress preferredAddress = null;
for (Enumeration enumeration = networkInterface.getInetAddresses(); enumeration.hasMoreElements(); ) {
InetAddress inetAddress = enumeration.nextElement();
//skip ipv6 local address
if (inetAddress.isLoopbackAddress() || inetAddress.isLinkLocalAddress()) {
continue;
}
//prefer ipv4 over ipv6
if (inetAddress instanceof Inet4Address) {
preferredAddress = inetAddress;
break;
}
//take first ipv6 address
if (preferredAddress == null) {
preferredAddress = inetAddress;
}
}
if (preferredAddress != null) {
return format(preferredAddress);
}
}
} catch (Throwable e) {
e.printStackTrace();
}
return “”;
}
private static String format(InetAddress address) {
if (address instanceof Inet4Address) {
return address.getHostAddress();
} else if (address instanceof Inet6Address) {
final String ip = address.getHostAddress();
final int index = ip.indexOf(‘%’);
if (index >= 0) {
return ip.substring(0, index);
} else {
return ip;
}
}
return “”;
}
4:获取wifi下ip
获取wifi下的ip地址,我们需要用到WifiManager类.
- 通过Context.getSystemService(Context.WIFI_SERVICE)方法获取到WifiManager对象
- 通过WifiManager对象调用getConnectionInfo()方法即可获取到当前连接的Wi-Fi网络的信息 需要申请权限
<uses-permission android:name=“android.permission.ACCESS_WIFI_STATE”/>
- wifiInfo.getIpAddress(): 获取当前设备连接的Wi-Fi网络的IP地址.
- intToIp()方法用于转换ip地址.
/**
* @param context
* @return 获取ip
* request android.permission.ACCESS_WIFI_STATE
*/
public static String getWifiIp(Context context) {
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
final WifiInfo wifiInfo = wifiManager.getConnectionInfo();
if (wifiInfo != null) {
int ipAddress = wifiInfo.getIpAddress();
if (ipAddress != 0) {
return intToIp(ipAddress);
}
}
return “”;
}
private static String intToIp(int i) {
return (i & 0xFF) + “.” +
((i >> 8) & 0xFF) + “.” +
((i >> 16) & 0xFF) + “.” +
(i >> 24 & 0xFF);
}
5:获取ip地址
下面的方法是对前面方法的封装.
/**
* @param context
* @return 获取ip地址
* request android.permission.INTERNET
* request android.permission.ACCESS_WIFI_STATE
*/
public static String getIp(Context context) {
try {
if (getConnectNetType(context) == CONNECT_NET_WIFI) {
return getWifiIp(context);
} else {
return getMobileIp();
}
} catch (Throwable e) {
Log.e(“xxxx”, “getip :”, e);
}
return “”;
}