出现的问题:之前是通过WiFi管理器拿到DhcpInfo对象,获取netmask转换成对应子网掩码。有部分手机会出现获取的子网掩码为0.0.0.0,其中魅族手机 系统adnroid 9和vivo 系统android 11会出现掩码为0的问题。
分析问题原因:根据出现问题的测试机系统来看,估计不是系统版本导致的问题了。然后网上查找资料,看到有人说这个是系统的bug。那只能要找其它获取子网掩码的方法。找到一篇文章说可以通过adb命令执行 ifconfig 属性获取所有网卡数据信息,手机连接上电脑实践如下:
从上图中可以看到有我们需要的子网掩码信息,主要查看lo(本机 )和wlan0(无线网卡)两项。根据数据可知wlan0才是我们需要的数据。
- 把adb命令 继续实践到代码上,执行代码如下:
/**
* 获取WiFi掩码
* @return
*/
public static String getWiFiMask() {
Process cmdProcess = null;
BufferedReader reader = null;
String dnsIP = "";
StringBuffer stringBuffer = new StringBuffer();
try {
cmdProcess = Runtime.getRuntime().exec("ifconfig");
reader = new BufferedReader(new InputStreamReader(cmdProcess.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
return stringBuffer.toString();
} catch (IOException e) {
return null;
} finally {
try {
reader.close();
} catch (IOException e) {
}
cmdProcess.destroy();
}
}
测试结果就是啥都没有返回,查找资料执行ifconfig为啥没有数据返回,还是以无果终结。去android developer 通过 API 文档,getNetworkInterfaces 方法即可得到当前机器上所有的网络接口
参考以下两篇博客:
https://segmentfault.com/a/1190000007462741
https://www.lyile.cn/articles/2021/01/27/1611738521296.html
结合自己需求 代码如下:
/**
* 解决DhcpInfo获取WiFi子网掩码为0的问题
* @return
*/
public static String getIpAddrMask() {
try {
Enumeration<NetworkInterface> networkInterfaceEnumeration = NetworkInterface.getNetworkInterfaces();
while (networkInterfaceEnumeration.hasMoreElements()) {
NetworkInterface networkInterface = networkInterfaceEnumeration.nextElement();
if (!networkInterface.isUp()) {
continue;
}
for (InterfaceAddress interfaceAddress : networkInterface.getInterfaceAddresses()) {
if (interfaceAddress.getAddress() instanceof Inet4Address) {
if (!"127.0.0.1".equals(interfaceAddress.getAddress().getHostAddress())) {
return calcMaskByPrefixLength(interfaceAddress.getNetworkPrefixLength());
}
}
}
}
} catch (SocketException e) {
e.printStackTrace();
}
return "";
}
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;
}