web-dev-qa-db-fra.com

Obtenir mon adresse ip wifi Android

Comment puis-je obtenir l'adresse IP de mon téléphone lorsqu'il est connecté en wifi?

J'ai trouvé une méthode ici mais il renvoie quelque chose comme 24.182.239.255 même si je suis sous wifi et que j'attends quelque chose comme 192.168.1.10.

Je voudrais quelque chose comme:

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

Merci beaucoup!

34
Luigi Tiburzi

Si vous souhaitez obtenir l'adresse IP privée de votre appareil lorsque vous êtes connecté au Wi-Fi, vous pouvez essayer ceci.

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

Assurez-vous d'ajouter l'autorisation 

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

à votre manifeste.

39
Siddharth N

Il faut donc prendre en compte que Formatter.formatIpAddress (int) est obsolète:

Cette méthode était obsolète dans l'API niveau 12 . Utilisez getHostAddress (), qui prend en charge les adresses IPv4 et IPv6. Cette méthode ne prend pas en charge les adresses IPv6.

Donc, utiliser formatIpAddress(int) n'est probablement pas une bonne solution à long terme, bien que cela fonctionne.

Voici une solution potentielle si vous souhaitez absolument obtenir l'adresse IP de l'interface 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;
}

Comme indiqué dans les réponses précédentes, vous devez définir les éléments suivants dans votre AndroidManifest.xml:

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

Notez qu'il ne s'agit que d'un exemple de solution. Vous devriez prendre le temps de vérifier les valeurs NULL et ainsi de suite pour vous assurer que l'UX est lisse.

L'ironie est que, d'une part, Google désapprouve formatIpAddress(int), mais qu'il a toujours getIpAddress () renvoie toujours une valeur entière. L'adresse IP étant un int, il est également exclu d'être conforme à IPv6.

Vient ensuite le fait que l’endianité peut être un problème ou non. Je n'ai testé que trois appareils et ils ont tous été little-endian. Il semble que l'endianité puisse varier en fonction du matériel, même si nous exécutons des machines virtuelles, cela peut toujours poser problème. Donc, pour être sûr, j'ai ajouté une vérification Endian dans le code.

getByAddress (byte []) semble vouloir que la valeur entière soit big endian. D'après les recherches, il apparaît que l'ordre des octets du réseau est big-endian. Cela a du sens, car une adresse comme 192.168.12.22 est un numéro big-endian.


Découvrez le projet HammerNet GitHub. Il implémente le code ci-dessus avec un ensemble de contrôles de cohérence, la capacité à gérer les valeurs par défaut pour les DAV, les tests unitaires, etc. Je devais implémenter ceci pour une de mes applications et j'ai décidé d'ouvrir la bibliothèque.

66
pedrohdz

Cela vous permettra d'obtenir le WiFi IPv4, IPv6 ou les deux.

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

Usage:

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

Et n'oublie pas:

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

Si adb est installé dans le terminal, alors:

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

D'après mes journaux de crash, il semble que tous les appareils ne renvoient pas l'adresse MAC WiFi.

Voici une version plus propre de la réponse la plus populaire. 

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

Trouvé cette belle réponse, 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

Ajouter la permission suivante.

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

WifiManager s'initialise dans onCreate.

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

Utilisez la fonction suivante.

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

Le code suivant provient des paramètres AOSP. Il obtient l'ip du lien actif, peu importe le wifi ou le mobile. C'est le moyen le plus courant.

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