2012-06-13 10 views
20

estoy tratando de obtener la dirección IP de un dispositivo es decir el uso de conexión WiFi o 3G. Estoy obteniendo la dirección IP en formato IPV6 que no es comprensible. Quiero en formato IPV4 la dirección IP. He hecho google pero no he encontrado ninguna solución adecuada.¿Cómo llego DIRECCIÓN_IP en formato IPV4

aquí es código que estoy usando para obtener la dirección IP de un dispositivo de

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

Estoy consiguiendo este ouput:

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

Se debe mostrar la siguiente manera:

192.168.1.1 

favor me ayude ..

Respuesta

44

Después de probar muchos trucos .. finalmente puede obtener la dirección IP en formato IPv4 .. Aquí está mi código ..

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

Agregado si condición como se muestra a continuación

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

en lugar de esto

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

Muchas gracias .. Rahul

Una alternativa para comprobar si la dirección es una dirección de la versión 4 es:

if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) 
+0

No olvide el permiso para evitar el resultado nulo : Vyacheslav

+0

Dónde y qué declarar "ipv4" esto – CrazyMind

2

Parece que hay una clase separada Inet4Address en la API de Java para direcciones IPv4.

+0

he intentado, pero su dirección IP por defecto de dar un emulador no localhost dirección IP .. –

+0

localhost es 127.0.0.1, no creo que esto es lo que desea. –

+0

@ Tech.Rahul si quería obtener el localhost no se podía usar algo como 'InetAddress dir = InetAddress.getLocalHost();'? – 0nyx

8

No se puede asumir que cualquier dispositivo tiene sólo una dirección de red. Tampoco puede suponer que tendrá ningún IPv4, solo puede ser IPv6, por lo que su aplicación deberá ser capaz de manejar las pantallas de direcciones IPv4 e IPv6.

Normalmente, un teléfono Android tiene al menos dos interfaces que tienen asignadas direcciones IP utilizables, rmnet0 para los datos 3G, que para IPv4 a menudo es de nivel carrier y no puede aceptar conexiones de socket entrantes, y también puede tener un IPv6 dirección; y wlan0 para el wifi, que tendrá la dirección IPv4 y/o IPv6 que pueda negociar con la red a la que se adjunta.

Algunas versiones de Android bajarán intencionalmente la (típicamente más caro) enlace rmnet0 cuando se une a wifi - en un intento de reducir el uso de datos 3G. Este comportamiento es un problema cuando el wifi se ha conectado a algo que es un portal cautivo que requiere un inicio de sesión manual.

Cuestiones relacionadas