通過WifiMange獲得ip步驟如下:
WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff), (ipAddress >> 8 & 0xff), (ipAddress >> 16 & 0xff), (ipAddress >> 24 & 0xff));
目前還不清楚什麼原因,某些設備獲取wifiInfo.getIpAddress()返回值是個負數值;
所以查看android源碼【AbstractIpAddressPreferenceController.java】
@Override
protected void updateConnectivity() {
String ipAddress = getDefaultIpAddresses(mCM);
if (ipAddress != null) {
mIpAddress.setSummary(ipAddress);
} else {
mIpAddress.setSummary(R.string.status_unavailable);
}
}
/**
* Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
* addresses.
* @param cm ConnectivityManager
* @return the formatted and newline-separated IP addresses, or null if none.
*/
private static String getDefaultIpAddresses(ConnectivityManager cm) {
LinkProperties prop = cm.getActiveLinkProperties();
return formatIpAddresses(prop);
}
private static String formatIpAddresses(LinkProperties prop) {
if (prop == null) return null;
Iterator<InetAddress> iter = prop.getAllAddresses().iterator();
// If there are no entries, return null
if (!iter.hasNext()) return null;
// Concatenate all available addresses, newline separated
StringBuilder addresses = new StringBuilder();
while (iter.hasNext()) {
addresses.append(iter.next().getHostAddress());
if (iter.hasNext()) addresses.append("\n");
}
return addresses.toString();
}
可以看到,系統源碼是用ConnectivityManager 方法獲取,從中提取後方法如下:
ConnectivityManager conMann =(ConnectivityManager)this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobileNetworkInfo =
conMann.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetworkInfo = conMann.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mobileNetworkInfo.isConnected()) {
System.out.println("ip ==== " + getLocalIpAddress());
}
經過測試,可以獲得正確IP地址;