終於取到了Android的子網掩碼
轉自:http://dingxianye.me/2019/04/03/終於取到了Android的子網掩碼/
最近工作上有個需求是拿到Android手機的子網掩碼(Subnet Mask、Netmask、Mask),但是我發現這事兒並不簡單,因為無論是baidu還是google,給出來的答案都是沒什麼用的。
最常見的一般就是讓你去拿到WifiManager
,再拿到DhcpInfo
,最後通過intToIp(dhcpInfo.netmask)
拿到掩碼,但是我告訴你,這種方法拿到的掩碼往往是0.0.0.0
,錯的。至於為什麼拿不到,google上也有很多討論,可以自行搜尋,似乎是一個延續了很多版本的bug,而且目前至少8.x上還是有問題的。
另一種是使用反射通過ConnectivityManager
的hide方法getActiveLinkProperties
拿到ip地址,再通過形如n/xxx.xxx.xxx.xxx
的資料中n
去算掩碼(n表明的是掩碼中前n位是1),但是我告訴你,這種方法拿到的ip地址往往是/xxx.xxx.xxx.xxx
,沒有n
。
那應該怎麼辦?我找到了一種好方法,點進來看吧。
其實方法很簡單,我們發現通過linux提供的ifconfig
在shell中是完全可以拿到子網掩碼的,所以解決方案也就有了。
INTERNET Runtime.getRuntime().exec(new String[] { "ifconfig" })
具體的方法可以參考我的一個demo,有興趣的朋友可以幫我改進demo裡的解析方法,因為解析方法是不併保證適配了所有版本的系統(我是在8.x上測試的),demo地址如下:
src/main/java/me/dingxianye/demo/network/DXNetworkUtil.java
解析出來的每個網路連線的結果會放到下面的結構中
public class DXIfconfig { public String inetAddr; // ip public String bcast;// gateway public String mask;// netmask ... }
我們之後就可以通過ip去拿到對應的子網掩碼幹活兒了。
對於文章最前面提到的無效方法,也可以參看src/main/java/me/dingxianye/demo/network/BadNetworkUtilDemo.java 獲得程式碼。