所以要考虑的是 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();
// Convert little-endian to big-endianif needed
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" />
请注意,这只是一个示例解决方案。您应该花时间检查空值等,以确保 UX 流畅。
具有讽刺意味的是,一方面 Google 弃用了 formatIpAddress(int),但仍有 getIpAddress() 仍然返回一个整数值。 IP 地址是 int 也排除了它与 IPv6 兼容。
接下来是字节顺序可能是也可能不是问题的事实。我只测试了三个设备,它们都是小端的。看起来字节序可能因硬件而异,即使我们在 VM 中运行,这仍然是一个问题。所以为了安全起见,我在代码中添加了字节序检查。
getByAddress(byte[]) 似乎希望整数值是大端。从对此的研究看来,网络字节顺序是大端的。这是有道理的,因为像 192.168.12.22 这样的地址是一个大端数。
查看HammerNet GitHub 项目。它实现了上面的代码以及一堆健全性检查、处理 AVD 的默认值、单元测试和其他东西的能力。我必须为我的一个应用程序实现这一点,并决定开源该库。