Quindi, qualcosa da considerare è che si sta Formatter.formatIpAddress(int) deprecato:
Questo metodo è stata sconsigliata a livello di API 12. Usa getHostAddress(), che supporta sia IPv4 e indirizzi IPv6. Questo metodo non supporta gli indirizzi IPv6.
Quindi utilizzare formatIpAddress(int)
non è una buona soluzione a lungo termine, anche se funzionerà.
Ecco una possibile soluzione se si sta cercando di ottenere assolutamente sull'indirizzo IP per l'interfaccia WiFi:
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;
}
Come indicato nelle risposte precedenti, è necessario impostare quanto segue nel AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
si noti che questo è solo un esempio di soluzione. Si dovrebbe prendere tempo per verificare i valori nulli e così via per assicurarsi che l'UX sia scorrevole.
L'ironia è che da un lato Google è deprecating formatIpAddress(int)
, ma ha ancora getIpAddress() restituisce ancora un valore intero. Anche l'indirizzo IP è un int che lo esclude per essere conforme a IPv6.
Il prossimo è il fatto che endianness può o non può essere un problema. Ho testato solo tre dispositivi e sono stati tutti little-endian. Sembra che l'endianità possa variare a seconda dell'hardware, anche se stiamo girando in VM questo può ancora essere un problema. Quindi, per essere al sicuro, ho aggiunto un controllo endian nel codice.
getByAddress(byte[]) sembra voler che il valore intero sia big endian. Dalla ricerca di questo sembra che l'ordine dei byte di rete è big-endian. Ha senso dal momento che un indirizzo come 192.168.12.22 è un numero big-endian.
Partenza HammerNet progetto GitHub. Implementa il codice sopra insieme a una serie di controlli di integrità, possibilità di gestire i valori predefiniti per AVD, test di unità e altre cose. Ho dovuto implementarlo per una mia app e ho deciso di aprire la libreria.
Sembra che ti aspetti l'IP privato. Questo aiuterà. http://stackoverflow.com/questions/6064510/how-to-get-ip-ad-ress-of-the-device –