百度大法搜的获取网络配置(包括子网掩码)的方法基本都是拿wifimanager的dhcpinfo获取网络信息。
这个方法获取到的其他信息都没问题,唯独子网掩码获取到的要么就是错的,要么就是0.0.0.0
有问题的获取方式如下:
public static String getNetMask(Context context){
DhcpInfo dhcpInfo = ((WifiManager) context
.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo();
return formatIpAddress(dhcpInfo.netmask);
}
private static String formatIpAddress(int ipAdress) {
return (ipAdress & 0xFF ) + "." +
((ipAdress >> 8 ) & 0xFF) + "." +
((ipAdress >> 16 ) & 0xFF) + "." +
( ipAdress >> 24 & 0xFF) ;
}
我使用此方式获取的子网掩码大多数是0.0.0.0,偶尔是255.0.0.0,但真实的子网掩码是255.255.252.0
参考终于取到了Android的子网掩码 - 简书 (jianshu.com)的方法
使用ifconfig并解析的方式获取子网掩码,但是参考链接里没有做出网卡区分,在此对这个方法做一定的修改
针对的默认ifconfig的打印如下:
wlan0 Link encap:Ethernet HWaddr 44:01:bb:4e:0d:8a Driver rtl8723du
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:19568 errors:0 dropped:36 overruns:0 frame:0
TX packets:6412 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2554230 TX bytes:3465241
p2p0 Link encap:Ethernet HWaddr 46:01:bb:4e:0d:8a Driver rtl8723du
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 TX bytes:0
eth0 Link encap:Ethernet HWaddr bc:26:1d:04:4a:f9
inet addr:192.168.50.6 Bcast:192.168.50.255 Mask:255.255.255.0
inet6 addr: fe80::6de2:eac1:c614:5ccb/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:224 errors:0 dropped:0 overruns:0 frame:0
TX packets:6665 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29352 TX bytes:2200704
Interrupt:41 Base address:0x4000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope: Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:255 errors:0 dropped:0 overruns:0 frame:0
TX packets:255 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1
RX bytes:18156 TX bytes:18156
分别作了获取默认的wlan0的子网掩码和获取eth0的子网掩码,代码如下:
private static final String defaultIP = "0.0.0.0";
private static final String command = "ifconfig";
public static String getWlan0Mask() {
String TAG = "lanky";
String Mask = defaultIP;
try {
Process process = Runtime.getRuntime().exec(new String[]{command});
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
do {
String line = bufferedReader.readLine();
if (line == null) {
Log.d(TAG, "test: line is null");
break;
}
if (line.startsWith("wlan0 ")) {
Mask = defaultIP;
}
Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
if (line.startsWith("p2p0 ")) {
break;
}
} while (true);
} catch (IOException e) {
e.printStackTrace();
}
return Mask;
}
public static String getEth0Mask() {
String TAG = "lanky";
String Mask = defaultIP;
try {
Process process = Runtime.getRuntime().exec(new String[]{command});
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
do {
String line = bufferedReader.readLine();
if (line == null) {
Log.d(TAG, "test: line is null");
break;
}
if (line.startsWith("eth0 ")) {
Mask = defaultIP;
}
Mask = getLineMask(line).equals("") ?Mask:getLineMask(line);
if (line.startsWith("lo ")) {
break;
}
} while (true);
} catch (IOException e) {
e.printStackTrace();
}
return Mask;
}
private static String getLineMask(String line){
String TAG = "mask";
String IP = "";
if (line.trim().matches("inet addr:(\\d{1,3}\\.){3}\\d{1,3}( ){2}" +
"(Bcast:(\\d{1,3}\\.){3}\\d{1,3}( ){2}){0,1}" +
"Mask:(\\d{1,3}\\.){3}\\d{1,3}")) {
String[] props = line.trim().split("( ){2}");
for (String prop : props) {
if (prop.length() == 0) {
continue;
}
String[] kv = prop.split(":");
if (kv[0].startsWith("inet addr")) {
Log.d(TAG, "----ipAddr: " + kv[1]);
} else if (kv[0].startsWith("Bcast")) {
Log.d(TAG, "----Bcast: " + kv[1]);
} else if (kv[0].startsWith("Mask")) {
Log.d(TAG, "----mask: " + kv[1]);
IP = kv[1];
}
}
}
return IP;
}
如果有多个网卡,要想获取别的,可以参考我这个代码,根据你自己的ifconfig的打印来修改就好了
注:需要uid.system和系统签名及权限,适合系统级应用的开发参考,比如setting、Launcher等