调用方式:
getIpAddrForInterfaces("eth0");
getIpAddrMaskForInterfaces("eth0");
getGateWay();
etDns(context);
/**
* ip
*/
public static String getIpAddrForInterfaces(String interfaceName) {
try {
Enumeration<NetworkInterface> enNetworkInterface = NetworkInterface.getNetworkInterfaces(); //获取本机所有的网络接口
while (enNetworkInterface.hasMoreElements()) { //判断 Enumeration 对象中是否还有数据
NetworkInterface networkInterface = enNetworkInterface.nextElement(); //获取 Enumeration 对象中的下一个数据
if (!networkInterface.isUp()) { // 判断网口是否在使用
continue;
}
if (!interfaceName.equals(networkInterface.getDisplayName())) { // 网口名称是否和需要的相同
continue;
}
Enumeration<InetAddress> enInetAddress = networkInterface.getInetAddresses(); //getInetAddresses 方法返回绑定到该网卡的所有的 IP 地址。
while (enInetAddress.hasMoreElements()) {
InetAddress inetAddress = enInetAddress.nextElement();
if (inetAddress instanceof Inet4Address) { //判断是否未ipv4
return inetAddress.getHostAddress();
}
// 判断未lo时
// if (inetAddress instanceof Inet4Address && !inetAddress.isLoopbackAddress()) {
// return inetAddress.getHostAddress();
// }
}
}
} catch (Exception e) {
e.printStackTrace();
}
return "error";
}
/**
* 子网掩码
*/
public static String getIpAddrMaskForInterfaces(String interfaceName) {
try {
Enumeration<NetworkInterface> networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces(); //获取本机所有的网络接口
while (networkInterfaceEnumeration.hasMoreElements()) { //判断 Enumeration 对象中是否还有数据
NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement(); //获取 Enumeration 对象中的下一个数据
if (!networkInterface.isUp() && !interfaceName.equals(networkInterface.getDisplayName())) { //判断网口是否在使用,判断是否时我们获取的网口
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) { //
if (interfaceAddress.getAddress() instanceof Inet4Address) { //仅仅处理ipv4
return calcMaskByPrefixLength(interfaceAddress.getNetworkPrefixLength()); //获取掩码位数,通过 calcMaskByPrefixLength 转换为字符串
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "error";
}
//通过子网掩码的位数计算子网掩码
public static String calcMaskByPrefixLength(int length) {
int mask = 0xffffffff << (32 - length);
int partsNum = 4;
int bitsOfPart = 8;
int maskParts[] = new int[partsNum];
int selector = 0x000000ff;
for (int i = 0; i < maskParts.length; i++) {
int pos = maskParts.length - 1 - i;
maskParts[pos] = (mask >> (i * bitsOfPart)) & selector;
}
String result = "";
result = result + maskParts[0];
for (int i = 1; i < maskParts.length; i++) {
result = result + "." + maskParts[i];
}
return result;
}
/**
* 网关
*/
public static String getGateWay() {
String[] arr;
try {
Process process = Runtime.getRuntime().exec("ip route list table 0");
String data = null;
BufferedReader ie = new BufferedReader(new InputStreamReader(process.getErrorStream()));
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String string = in.readLine();
arr = string.split("\\s+");
return arr[2];
} catch (IOException e) {
e.printStackTrace();
}
return "error";
}
/**
* 获取dns
*
* @param context
* @return
*/
public static String getDns(Context context) {
/**
* 获取dns
*/
String[] dnsServers = getDnsFromCommand();
if (dnsServers == null || dnsServers.length == 0) {
dnsServers = getDnsFromConnectionManager(context);
}
/**
* 组装
*/
StringBuffer sb = new StringBuffer();
if (dnsServers != null) {
for (int i = 0; i < dnsServers.length; i++) {
sb.append(dnsServers[i]);
//sb.append(" / ");
}
}
//
return sb.toString();
}
//通过 getprop 命令获取
public static String[] getDnsFromCommand() {
LinkedList<String> dnsServers = new LinkedList<>();
try {
Process process = Runtime.getRuntime().exec("getprop");
InputStream inputStream = process.getInputStream();
LineNumberReader lnr = new LineNumberReader(new InputStreamReader(inputStream));
String line = null;
while ((line = lnr.readLine()) != null) {
int split = line.indexOf("]: [");
if (split == -1) continue;
String property = line.substring(1, split);
String value = line.substring(split + 4, line.length() - 1);
if (property.endsWith(".dns")
|| property.endsWith(".dns1")
|| property.endsWith(".dns2")
|| property.endsWith(".dns3")
|| property.endsWith(".dns4")) {
InetAddress ip = InetAddress.getByName(value);
if (ip == null) continue;
value = ip.getHostAddress();
if (value == null) continue;
if (value.length() == 0) continue;
dnsServers.add(value);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return dnsServers.isEmpty() ? new String[0] : dnsServers.toArray(new String[dnsServers.size()]);
}
private static String[] getDnsFromConnectionManager(Context context) {
LinkedList<String> dnsServers = new LinkedList<>();
if (Build.VERSION.SDK_INT >= 21 && context != null) {
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
if (connectivityManager != null) {
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if (activeNetworkInfo != null) {
for (Network network : connectivityManager.getAllNetworks()) {
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(network);
if (networkInfo != null && networkInfo.getType() == activeNetworkInfo.getType()) {
LinkProperties lp = connectivityManager.getLinkProperties(network);
for (InetAddress addr : lp.getDnsServers()) {
dnsServers.add(addr.getHostAddress());
}
}
}
}
}
}
return dnsServers.isEmpty() ? new String[0] : dnsServers.toArray(new String[dnsServers.size()]);
}