獲取手機的IP分爲獲取WIFI無線的IP和數據網絡的IP,其中獲取WiFi的IP其實就是路由IP,手機數據網絡IP則爲運營商基站IP,這個可能會隨着你的移動而不停改變。
同時獲取所有信息
Android 中提供了方法讓我們可以獲取到當前所有網段的IP以及和IP相關的掩碼信息。以下是獲取wifi和數據網絡ip等相關信息的方法,其中INetAddressInfo爲我自己定義的一個類用於接收信息。
public static ArrayList<INetAddressInfo> getINetAddressInfo() {
ArrayList<INetAddressInfo> iNetAddressInfos = new ArrayList<>();
try {
Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces();
while (eni.hasMoreElements()) {
INetAddressInfo iNetAddressInfo = new INetAddressInfo();
NetworkInterface en = eni.nextElement();
if (en.isUp() && !en.isLoopback()) {
String name = en.getName();
if (name.contains("wlan") || name.contains("rmnet")) {
List<InterfaceAddress> addresses = en.getInterfaceAddresses();
for (InterfaceAddress address : addresses) {
InetAddress inetAddress = address.getAddress();
String ip = inetAddress.getHostAddress();
if (!ip.contains(":")) {
iNetAddressInfo.type = name.contains("wlan") ?
INetAddressInfo.TYPE_WIFI : INetAddressInfo.TYPE_MOBILE;
iNetAddressInfo.ip = ip;
iNetAddressInfo.maskLen = address.getNetworkPrefixLength();
iNetAddressInfos.add(iNetAddressInfo);
}
}
}
}
}
return iNetAddressInfos;
} catch (SocketException ignore) {
return new ArrayList<>();
}
}
獲取這些信息的核心思想就是通過獲取當前所有網段,然後通過網段關鍵字wlan(表示wifi),rmnet(表示數據網絡)來分別獲取網段信息,從而獲取到IP。當我們其中某個網絡處於斷開狀態時,那麼它便不會獲取到相關信息。
該方法獲取到的信息,可以在手機的全部參數頁面中查看IP,其中掩碼就是IP後邊緊跟的數據。
這種獲取信息的方法最好在子線程中進行,主線程中偶爾會產生ANR
單獨獲取wifi的IP信息
可能有時候,我們只想獲取到WiFi的IP信息,那麼可以通過WiFiManager來獲取。
WifiManager wm = (WifiManager)getApplicationContext().getSystemService(WIFI_SERVICE);
int netmask = wm.getDhcpInfo().netmask; // 掩碼
String ip = long2ip(wm.getDhcpInfo().ipAddress);// ip
Log.d("zzz","netmask = " + netmask + "," + long2ip(netmask) + ",ip = " + ip );
String long2ip(long ip){
StringBuffer sb=new StringBuffer();
sb.append(String.valueOf((int)(ip&0xff)));
sb.append('.');
sb.append(String.valueOf((int)((ip>>8)&0xff)));
sb.append('.');
sb.append(String.valueOf((int)((ip>>16)&0xff)));
sb.append('.');
sb.append(String.valueOf((int)((ip>>24)&0xff)));
return sb.toString();
}
通過這種方法獲取到的是ip信息的位數,所以我們需要通過移位轉換一下。
掩碼十進制和位數之間的換算
掩碼一共有32個,從1開始一直到32。我們平時所見的掩碼格式爲255.255.255.0,這個是掩碼的十進制表示,而在網絡數據傳輸中是二進制傳輸,所以我們也會經常見到掩碼的另一種格式,比如:192.168.0.1/23,其中的23就是掩碼位數,掩碼二進制長度固定爲32位。
1111 1111 1111 1111 1111 1111 1111 1111
而掩碼規定,掩碼位數必須首位開始前邊連續爲1,後方連續爲0,1的個數不定,可以爲0-32個,所以掩碼也就確定了一共只有32個,因爲只能有32 個1。
192.168.0.1/23
1111 1111 1111 1111 1111 1110 0000 0000
255 255 254 0
對於255.255.254.0這種格式,其實就是把32個1/0分成四組,每8個一組,計算十進制,例如 1111 1111 就是255。中間再補上.,就成了最終的掩碼。