需要考虑的一点是,Formatter.formatIpAddress(int) 已被弃用:
此方法在API级别12中已弃用。
使用 getHostAddress(),它支持IPv4和IPv6地址。该方法不支持IPv6地址。
因此,在长期解决方案方面,使用 formatIpAddress(int)
可能并不是一个好选择,尽管它可以正常工作。
如果你想要获取WiFi接口的IP地址,这里有一个潜在的解决方案:
protected String wifiIpAddress(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(WIFI_SERVICE);
int ipAddress = wifiManager.getConnectionInfo().getIpAddress();
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
byte[] ipByteArray = BigInteger.valueOf(ipAddress).toByteArray();
String ipAddressString;
try {
ipAddressString = InetAddress.getByAddress(ipByteArray).getHostAddress();
} catch (UnknownHostException ex) {
Log.e("WIFIIP", "Unable to get host address.");
ipAddressString = null;
}
return ipAddressString;
}
如前面的回复所述,您需要在AndroidManifest.xml中设置以下内容:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
请注意,这只是一个示例解决方案。 您应该花时间检查空值等等,以确保用户体验顺畅。
具有讽刺意味的是,一方面Google正在淘汰formatIpAddress(int)
,但仍然使用getIpAddress()返回整数值。 IP地址作为整数也排除了它符合IPv6的可能性。
接下来的问题是大小端可能会成为问题,也可能不是问题。 我只测试过三个设备,它们都是小端。尽管我们在虚拟机中运行,但硬件可能会出现大小端的差异。因此,为了安全起见,我在代码中添加了一个大小端检查。
getByAddress(byte[])似乎希望整数值为大端。 从研究中发现,网络字节序是大端。 这很有道理,因为像192.168.12.22这样的地址是一个大端数字。
请查看HammerNet GitHub项目。 它实现了上面的代码以及一堆健全性检查,处理AVD的默认值的能力,单元测试以及其他功能。 我不得不为我的应用程序实施这个库,并决定开源它。