web-dev-qa-db-fra.com

Comment puis-je obtenir une ADRESSE IP au format IPV4

J'essaie d'obtenir l'adresse IP d'un appareil, c'est-à-dire en utilisant une connexion WIFI ou 3G. J'obtiens l'adresse IP au format IPV6 qui n'est pas compréhensible. Je veux une adresse IP au format IPV4. J'ai fait google mais je n'ai trouvé aucune solution appropriée.

voici le code que j'utilise pour obtenir l'adresse IP d'un appareil

public String getLocalIpAddress() {
    try {
        try {
        for (Enumeration<NetworkInterface> en = NetworkInterface
                .getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) 
            {
                InetAddress inetAddress = enumIpAddr.nextElement();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());
                if (!inetAddress.isLoopbackAddress()) {


                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    return inetAddress.getHostAddress().toString();

                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

J'obtiens cette sortie:

ip1--:/fe80::5054:ff:fe12:3456%eth0%2
ip2--:fe80::5054:ff:fe12:3456%eth0

Il devrait être affiché comme ceci:

192.168.1.1

sil te plait aide moi..

23
Rahul Baradia

Après avoir essayé de nombreuses astuces .. enfin je peux obtenir l'adresse IP au format IPV4 .. Voici mon code ..

public String getLocalIpAddress() {
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface
                .getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf
                    .getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                System.out.println("ip1--:" + inetAddress);
                System.out.println("ip2--:" + inetAddress.getHostAddress());

      // for getting IPV4 format
      if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())) {

                    String ip = inetAddress.getHostAddress().toString();
                    System.out.println("ip---::" + ip);
                    EditText tv = (EditText) findViewById(R.id.ipadd);
                    tv.setText(ip);
                    // return inetAddress.getHostAddress().toString();
                    return ip;
                }
            }
        }
    } catch (Exception ex) {
        Log.e("IP Address", ex.toString());
    }
    return null;
}

Ajouté si condition comme indiqué ci-dessous

 /**This shows IPV4 format IP address*/
 if (!inetAddress.isLoopbackAddress() && InetAddressUtils.isIPv4Address(ipv4 = inetAddress.getHostAddress())){}

au lieu de cela

 /**This shows IPV6 format IP address*/
 if (!inetAddress.isLoopbackAddress()){}

Merci beaucoup .. Rahul

Une alternative pour vérifier si l'adresse est une adresse de version 4 est:

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address)
48
Rahul Baradia

Vous ne pouvez pas supposer qu'un appareil ne possède qu'une seule adresse réseau. Vous ne pouvez pas non plus supposer qu'il aura un IPv4 - il peut s'agir uniquement d'IPv6, votre application devra donc être capable de gérer à la fois l'affichage d'adresse IPv4 et IPv6.

En règle générale, un téléphone Android Android possède au moins deux interfaces auxquelles sont attribuées des adresses IP utilisables, rmnet0 pour les données 3G, qui pour IPv4 est souvent de type opérateur NAT et ne peut donc pas accepter les connexions de socket entrantes, et peut également avoir une adresse IPv6 et wlan0 pour le wifi, qui aura n'importe quelle adresse IPv4 et/ou IPv6 qu'il pourra négocier avec le réseau auquel il se connecte.

Certaines versions de Android supprimera intentionnellement le lien rmnet0 (généralement plus cher) lorsqu'il se connecte au wifi - dans le but de réduire l'utilisation des données 3G. Ce comportement est un problème lorsque le wifi s'est connecté à quelque chose qui est un portail captif qui nécessite une connexion manuelle.

8
Simon Hewison

Il semble qu'il existe une classe distincte Inet4Address dans le Java API pour les adresses IPv4.

2
0nyx

Voici un moyen simple de vérifier si c'est IPv4 ou IPv6:

InetAddress address = InetAddress.getByName(ip);
if (address instanceof Inet6Address) {
    // It's ipv6
} else if (address instanceof Inet4Address) {
    // It's ipv4
}
0
rkachach