所以需要考虑的是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" />
请注意,这只是一个示例解决方案。您应该花时间检查空值等,以确保用户体验顺利。
讽刺的是,一方面谷歌正在弃用formatIpAddress(int)
,但仍然有获取IP地址()仍然返回一个整数值。 IP 地址为 int 也排除了其与 IPv6 兼容的可能性。
接下来的事实是字节序可能是也可能不是问题。我只测试了三个设备,它们都是小尾数法。似乎字节序可能会根据硬件而变化,即使我们在虚拟机中运行,这仍然可能是一个问题。因此,为了安全起见,我在代码中添加了字节序检查。
获取地址(字节[])似乎希望整数值是大尾数。通过研究发现网络字节顺序是大端字节序。这是有道理的,因为像 192.168.12.22 这样的地址是一个大端数字。
查看锤子网GitHub 项目。它实现了上面的代码以及一系列健全性检查、处理 AVD 默认值的能力、单元测试和其他东西。我必须为我的应用程序实现此功能,并决定开源该库。