So etwas zu beachten ist, dass Formatter.formatIpAddress(int) veraltet wird:
Diese Methode in API-Ebene 12. Verwendung getHostAddress() veraltet wurde, die sowohl IPv4 als auch IPv6-Adressen unterstützt. Diese Methode unterstützt keine IPv6-Adressen.
Also mit formatIpAddress(int)
ist wahrscheinlich keine gute langfristige Lösung, obwohl es funktionieren wird.
Hier ist eine mögliche Lösung, wenn Sie unbedingt auf suchen, um die IP-Adresse für die WiFi-Schnittstelle zu erhalten:
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;
}
Wie bereits in früheren Antworten erwähnt, müssen Sie die folgenden in Ihrem AndroidManifest.xml einstellen:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
Beachten Sie, dass diese Lösung nur ein Beispiel. Sie sollten sich Zeit nehmen, nach Nullwerten usw. zu suchen, um sicherzustellen, dass das UX glatt ist.
Die Ironie ist, dass auf der einen Seite Google formatIpAddress(int)
abwertet, aber immer noch getIpAddress() noch einen ganzzahligen Wert zurückgibt. Die IP-Adresse, die ein Int ist, schließt auch aus, dass sie IPv6-kompatibel ist.
Als nächstes ist die Tatsache, dass Endianess ein Problem sein kann oder nicht. Ich habe nur drei Geräte getestet und sie alle waren Little-Endian. Es scheint, dass die Endianität je nach Hardware variieren kann. Obwohl wir in VMs laufen, kann dies immer noch ein Problem sein. Um auf der sicheren Seite zu sein, fügte ich einen Endian-Check im Code hinzu.
getByAddress(byte[]) scheint der Integer-Wert Big Endian zu sein. Aus der Untersuchung dieser scheint, dass Netzwerk-Byte-Reihenfolge Big-Endian ist. Sinnvoll, da eine Adresse wie 192.168.12.22 eine Big-Endian-Nummer ist.
Auschecken HammerNet GitHub-Projekt. Es implementiert den obigen Code zusammen mit einer Reihe von Plausibilitätsprüfungen, der Fähigkeit, Standardwerte für AVDs zu verarbeiten, Unit-Tests und anderen Dingen. Ich musste dies für eine App von mir implementieren und beschloss, die Bibliothek zu öffnen.
Sie scheinen die private IP zu erwarten. Das wird helfen. http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device –