2013-05-24 13 views
30

Wie kann ich die IP-Adresse meines Telefons erhalten, wenn es unter Wifi verbunden ist?Erhalten Sie meine wifi IP-Adresse Android

Ich fand eine Methode here, aber es gibt etwas wie 24.182.239.255 zurück, auch wenn ich unter Wifi bin und ich erwarte etwas wie 192.168.1.10.

würde Ich mag so etwas wie:

if (you are under wifi) 
    String ip4 = getWifiIP() 
else 
    String ip4 = getIPAddress with the method linked before 

Vielen Dank!

+0

Sie scheinen die private IP zu erwarten. Das wird helfen. http://stackoverflow.com/questions/6064510/how-to-get-ip-address-of-the-device –

Antwort

37

Wenn Sie die private IP-Adresse Ihres Geräts erhalten möchten, wenn Sie mit Wi-Fi verbunden sind, können Sie dies versuchen.

WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE); 
WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 
int ip = wifiInfo.getIpAddress(); 
String ipAddress = Formatter.formatIpAddress(ip); 

Seien Sie sicher, dass die Erlaubnis

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

zu Ihrem Manifest hinzuzufügen.

+11

formatIpAddress() ist veraltet. Siehe Lösung von Digital Rounin unten, wobei stattdessen InetAddress.getHostAddress() verwendet wird. – Emmanuel

+1

nur für Anfänger: es sollte getSystemService sein (Context.WIFI_SERVICE) – 10101010

+0

Endiannes ist eine wichtige Überlegung, der obige Code wird die umgekehrte IP auf Little Endian-Hardware zurückgeben. Überprüfen Sie Digital Rounins Antwort unten für die richtige Methode. Oder http://stackoverflow.com/questions/29937433/gethostaddress-returns-a-reversed-ip-adress für eine kürzere Methode (die die IP als int zurückgibt, aber in der richtigen Reihenfolge). –

61

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.

+0

kann BigInteger in Android Studio nicht importieren. ich weiß es seltsam, aber es ist so passiert. – 10101010

+2

Die Endianness-Konvertierung ist tatsächlich sehr wichtig für Nexus 5 und mehr Geräte. Vielen Dank ! – Danpe

+1

"WifiManager wifiManager = (WifiManager) context.getApplicationContext(). GetSystemService (Kontext.WIFI_SERVICE)" Es ist immer noch ein bisschen besser. – Denis

7

Dies wird Ihnen die WiFi IPv4, IPv6 oder beides.

public static Enumeration<InetAddress> getWifiInetAddresses(final Context context) { 
    final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    final WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    final String macAddress = wifiInfo.getMacAddress(); 
    final String[] macParts = macAddress.split(":"); 
    final byte[] macBytes = new byte[macParts.length]; 
    for (int i = 0; i< macParts.length; i++) { 
     macBytes[i] = (byte)Integer.parseInt(macParts[i], 16); 
    } 
    try { 
     final Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces(); 
     while (e.hasMoreElements()) { 
      final NetworkInterface networkInterface = e.nextElement(); 
      if (Arrays.equals(networkInterface.getHardwareAddress(), macBytes)) { 
       return networkInterface.getInetAddresses(); 
      } 
     } 
    } catch (SocketException e) { 
     Log.wtf("WIFIIP", "Unable to NetworkInterface.getNetworkInterfaces()"); 
    } 
    return null; 
} 

@SuppressWarnings("unchecked") 
public static<T extends InetAddress> T getWifiInetAddress(final Context context, final Class<T> inetClass) { 
    final Enumeration<InetAddress> e = getWifiInetAddresses(context); 
    while (e.hasMoreElements()) { 
     final InetAddress inetAddress = e.nextElement(); 
     if (inetAddress.getClass() == inetClass) { 
      return (T)inetAddress; 
     } 
    } 
    return null; 
} 

Verbrauch:

final Inet4Address inet4Address = getWifiInetAddress(context, Inet4Address.class); 
final Inet6Address inet6Address = getWifiInetAddress(context, Inet6Address.class); 

Und nicht vergessen:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
1

Wenn adb im Terminal installiert ist, dann tun:

Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress"); 
1

Basierend auf meinem Absturz Logs, es scheint nicht jedes Gerät gibt die WiFi-MAC-Adresse zurück.

Hier ist eine sauberere Version der beliebtesten Antwort.

final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
final ByteBuffer byteBuffer = ByteBuffer.allocate(4); 
byteBuffer.order(ByteOrder.LITTLE_ENDIAN); 
byteBuffer.putInt(wifiInfo.getIpAddress()); 
try { 
final InetAddress inetAddress = InetAddress.getByAddress(null, byteBuffer.array()); 
} catch (UnknownHostException e) { 
    //TODO: Return null? 
} 
+0

Was ist 'wifiInfo', Ihr Code ist unvollständig – behelit

-1

Formatter.formatIpAddress (int) ist veraltet:

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); 
String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString(); 
+0

Ja. Es wird IPv6 nicht unterstützen. – aclokay

0

Add Nach Genehmigung.

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 

WifiManager wird in onCreate initialisiert.

WifiManager wifiMgr = (WifiManager) getContext().getSystemService(context.WIFI_SERVICE); 

Verwenden Sie die folgende Funktion.

public void WI-FI_IP() { 
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo(); 
    int ip = wifiInfo.getIpAddress(); 
    String ipAddress = Formatter.formatIpAddress(ip); 
    }