it-swarm.com.de

Holen Sie sich meine WLAN-IP-Adresse Android

Wie kann ich die IP-Adresse meines Telefons erhalten, wenn es über WLAN verbunden ist?

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

Ich möchte etwas wie:

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

Danke vielmals!

34
Luigi Tiburzi

Wenn Sie die private IP-Adresse Ihres Geräts bei einer WLAN-Verbindung erhalten möchten, können Sie dies versuchen.

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

Stellen Sie sicher, dass Sie die Berechtigung hinzufügen 

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

zu deinem Manifest.

39
Siddharth N

Zu beachten ist also, dass Formatter.formatIpAddress (int) veraltet ist:

Diese Methode wurde in API-Ebene 12 nicht mehr empfohlen. Verwenden Sie getHostAddress (), das sowohl IPv4- als auch IPv6-Adressen unterstützt. Diese Methode unterstützt keine IPv6-Adressen.

Daher ist die Verwendung von formatIpAddress(int) wahrscheinlich keine gute langfristige Lösung, obwohl dies funktionieren wird.

Hier ist eine mögliche Lösung, wenn Sie unbedingt die IP-Adresse für die WiFi-Schnittstelle abrufen möchten:

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 in den vorherigen Antworten angegeben, müssen Sie in Ihrer AndroidManifest.xml Folgendes festlegen:

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

Beachten Sie, dass dies nur eine beispielhafte Lösung ist. Sie sollten sich Zeit nehmen, um nach Nullwerten zu suchen und so weiter, um sicherzustellen, dass die UX reibungslos ist.

Die Ironie ist, dass Google einerseits formatIpAddress(int) veraltet, aber trotzdem getIpAddress () hat und dennoch einen ganzzahligen Wert zurückgibt. Die IP-Adresse ist ein int und schließt die IPv6-Kompatibilität aus.

Weiter ist die Tatsache, dass Endianness ein Problem sein kann oder nicht. Ich habe nur drei Geräte getestet und alle waren Little-Endian. Es sieht so aus, als ob die Endianness je nach Hardware unterschiedlich sein kann, auch wenn wir auf VMs arbeiten, kann dies dennoch ein Problem sein. Um auf der sicheren Seite zu sein, habe ich dem Code einen Endian-Check hinzugefügt.

getByAddress (byte []) scheint zu wollen, dass der ganzzahlige Wert ein Big-Endian-Wert ist. Aus diesen Untersuchungen geht hervor, dass die Netzwerk-Bytereihenfolge Big-Endian ist. Sinnvoll, da eine Adresse wie 192.168.12.22 eine Big-Endian-Zahl ist.


Check out HammerNet GitHub-Projekt. Es implementiert den obigen Code zusammen mit einer Reihe von Sicherheitsüberprüfungen, der Fähigkeit, mit Standardeinstellungen für AVDs, Unit-Tests und anderen Dingen umzugehen. Ich musste dies für eine App von mir implementieren und entschied mich, die Bibliothek als Open Source zu öffnen.

71
pedrohdz

Dadurch erhalten Sie das WiFi IPv4, IPv6 oder beide.

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;
}

Verwendungszweck:

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

Und vergiss nicht:

<uses-permission Android:name="Android.permission.ACCESS_WIFI_STATE" />
8
Dustin

Wenn adb im Terminal installiert ist, machen Sie

Runtime.getRuntime.exec("adb", "Shell", "getprop", "dhcp.wlan0.ipaddress");
1
Thejus Krishna

Basierend auf meinen Absturzprotokollen scheint es, dass nicht jedes Gerät die WLAN-MAC-Adresse zurückgibt.

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?
}
1
Dustin

Fand diese nette Antwort, https://Gist.github.com/stickupkid/1250733

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
int ipAddress = wifiInfo.getIpAddress();
String ipString = String.format(“%d.%d.%d.%d”, (ip & 0xff), (ip >> 8 & 0xff), (ip >> 16 & 0xff), (ip >> 24 & 0xff));
1
ElliotM

Folgende Erlaubnis hinzufügen.

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

WifiManager wird in onCreate initialisiert.

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

Verwenden Sie folgende Funktion.

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

Der folgende Code stammt aus AOSP-Einstellungen. Es bekommt die IP des aktiven Links, egal ob WLAN oder Handy. Es ist der häufigste Weg.

http://androidxref.com/8.0.0_r4/xref/packages/apps/Settings/src/com/Android/settings/deviceinfo/Status.Java#251

/**  
 * Returns the default link's IP addresses, if any, taking into account IPv4 and IPv6 style
 * addresses.
 * @param context the application context
 * @return the formatted and newline-separated IP addresses, or null if none.
 */
public static String getDefaultIpAddresses(ConnectivityManager cm) {                                                                      
    LinkProperties prop = cm.getActiveLinkProperties();
    return formatIpAddresses(prop);
}    

private static String formatIpAddresses(LinkProperties prop) {
    if (prop == null) return null;
    Iterator<InetAddress> iter = prop.getAllAddresses().iterator();
    // If there are no entries, return null
    if (!iter.hasNext()) return null;
    // Concatenate all available addresses, comma separated
    String addresses = "";
    while (iter.hasNext()) {
        addresses += iter.next().getHostAddress();
        if (iter.hasNext()) addresses += "\n";
    }
    return addresses;
}
0
Yong