¿Cómo obtener la dirección IP del dispositivo desde el código?

¿Es posible obtener la dirección IP del dispositivo utilizando algún código?

Este es mi helper util para leer direcciones IP y MAC. La implementación es pura-java, pero tengo un bloque de comentario en getMACAddress() que podría leer el valor del archivo especial de linux (android). He ejecutado este código sólo en algunos dispositivos y emulador, pero hágamelo saber aquí si encuentra resultados extraños.

 // AndroidManifest.xml permissions <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> // test functions Utils.getMACAddress("wlan0"); Utils.getMACAddress("eth0"); Utils.getIPAddress(true); // IPv4 Utils.getIPAddress(false); // IPv6 

Utils.java

 import java.io.*; import java.net.*; import java.util.*; //import org.apache.http.conn.util.InetAddressUtils; public class Utils { /** * Convert byte array to hex string * @param bytes * @return */ public static String bytesToHex(byte[] bytes) { StringBuilder sbuf = new StringBuilder(); for(int idx=0; idx < bytes.length; idx++) { int intVal = bytes[idx] & 0xff; if (intVal < 0x10) sbuf.append("0"); sbuf.append(Integer.toHexString(intVal).toUpperCase()); } return sbuf.toString(); } /** * Get utf8 byte array. * @param str * @return array of NULL if error was found */ public static byte[] getUTF8Bytes(String str) { try { return str.getBytes("UTF-8"); } catch (Exception ex) { return null; } } /** * Load UTF8withBOM or any ansi text file. * @param filename * @return * @throws java.io.IOException */ public static String loadFileAsString(String filename) throws java.io.IOException { final int BUFLEN=1024; BufferedInputStream is = new BufferedInputStream(new FileInputStream(filename), BUFLEN); try { ByteArrayOutputStream baos = new ByteArrayOutputStream(BUFLEN); byte[] bytes = new byte[BUFLEN]; boolean isUTF8=false; int read,count=0; while((read=is.read(bytes)) != -1) { if (count==0 && bytes[0]==(byte)0xEF && bytes[1]==(byte)0xBB && bytes[2]==(byte)0xBF ) { isUTF8=true; baos.write(bytes, 3, read-3); // drop UTF8 bom marker } else { baos.write(bytes, 0, read); } count+=read; } return isUTF8 ? new String(baos.toByteArray(), "UTF-8") : new String(baos.toByteArray()); } finally { try{ is.close(); } catch(Exception ex){} } } /** * Returns MAC address of the given interface name. * @param interfaceName eth0, wlan0 or NULL=use first interface * @return mac address or empty string */ public static String getMACAddress(String interfaceName) { try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { if (interfaceName != null) { if (!intf.getName().equalsIgnoreCase(interfaceName)) continue; } byte[] mac = intf.getHardwareAddress(); if (mac==null) return ""; StringBuilder buf = new StringBuilder(); for (int idx=0; idx<mac.length; idx++) buf.append(String.format("%02X:", mac[idx])); if (buf.length()>0) buf.deleteCharAt(buf.length()-1); return buf.toString(); } } catch (Exception ex) { } // for now eat exceptions return ""; /*try { // this is so Linux hack return loadFileAsString("/sys/class/net/" +interfaceName + "/address").toUpperCase().trim(); } catch (IOException ex) { return null; }*/ } /** * Get IP address from first non-localhost interface * @param ipv4 true=return ipv4, false=return ipv6 * @return address or empty string */ public static String getIPAddress(boolean useIPv4) { try { List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { List<InetAddress> addrs = Collections.list(intf.getInetAddresses()); for (InetAddress addr : addrs) { if (!addr.isLoopbackAddress()) { String sAddr = addr.getHostAddress(); //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); boolean isIPv4 = sAddr.indexOf(':')<0; if (useIPv4) { if (isIPv4) return sAddr; } else { if (!isIPv4) { int delim = sAddr.indexOf('%'); // drop ip6 zone suffix return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase(); } } } } } } catch (Exception ex) { } // for now eat exceptions return ""; } } 

Exención de responsabilidad: las ideas y el código de ejemplo para esta clase de utilidades provienen de varias publicaciones SO y google. He limpiado y combinado todos los ejemplos.

Esto funcionó para mí:

 WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress()); 

He utilizado código siguiente: La razón por la que he utilizado hashCode fue porque estaba recibiendo algunos valores de basura agregados a la dirección IP cuando utilicé getHostAddress . Pero hashCode funcionó muy bien para mí, entonces puedo usar Formatter para obtener la dirección IP con el formato correcto.

Aquí está el ejemplo de salida:

1.using getHostAddress : ***** IP=fe80::65ca:a13d:ea5a:233d%rmnet_sdio0

2.using hashCode y Formatter : ***** IP=238.194.77.212

Como se puede ver 2 ª métodos me da exactamente lo que necesito.

 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(); if (!inetAddress.isLoopbackAddress()) { String ip = Formatter.formatIpAddress(inetAddress.hashCode()); Log.i(TAG, "***** IP="+ ip); return ip; } } } } catch (SocketException ex) { Log.e(TAG, ex.toString()); } return null; } 

Aunque hay una respuesta correcta, comparto mi respuesta aquí y espero que esta manera sea más conveniente.

 WifiManager wifiMan = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); WifiInfo wifiInf = wifiMan.getConnectionInfo(); int ipAddress = wifiInf.getIpAddress(); String ip = String.format("%d.%d.%d.%d", (ipAddress & 0xff),(ipAddress >> 8 & 0xff),(ipAddress >> 16 & 0xff),(ipAddress >> 24 & 0xff)); 

Debajo de código podría ayudarle .. No se olvide de agregar permisos ..

 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(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } } catch (Exception ex) { Log.e("IP Address", ex.toString()); } return null; } 

Añada el permiso a continuación en el archivo de manifiesto.

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

Codificación feliz!

 public static 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(); if (!inetAddress.isLoopbackAddress() && inetAddress instanceof Inet4Address) { return inetAddress.getHostAddress(); } } } } catch (SocketException ex) { ex.printStackTrace(); } return null; } 

He agregado inetAddress instanceof Inet4Address para comprobar si es una dirección ipv4.

No es necesario agregar permisos como es el caso con las soluciones proporcionadas hasta ahora. Descargue este sitio web como una cadena:

http://www.ip-api.com/json

o

http://www.telize.com/geoip

Descargar un sitio web como una cadena se puede hacer con código java:

http://www.itcuties.com/java/read-url-to-string/

Analiza el objeto JSON de la siguiente manera:

https://stackoverflow.com/a/18998203/1987258

El atributo json "query" o "ip" contiene la dirección IP.

 private InetAddress getLocalAddress()throws IOException { 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(); if (!inetAddress.isLoopbackAddress()) { //return inetAddress.getHostAddress().toString(); return inetAddress; } } } } catch (SocketException ex) { Log.e("SALMAN", ex.toString()); } return null; } 

Si tiene un shell; Ifconfig eth0 trabajó para el dispositivo x86 también

Recientemente, una dirección IP sigue siendo devuelta por getLocalIpAddress() pesar de estar desconectada de la red (sin indicador de servicio). Significa que la dirección IP que se muestra en Ajustes> Acerca del teléfono> Estado era diferente de lo que pensaba la aplicación.

He implementado una solución al agregar este código antes:

 ConnectivityManager cm = getConnectivityManager(); NetworkInfo net = cm.getActiveNetworkInfo(); if ((null == net) || !net.isConnectedOrConnecting()) { return null; } 

¿Eso suena a alguien?

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

Por favor, compruebe este código … Usando este código. Obtendremos ip desde Internet móvil …

 for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements(); ) { NetworkInterface intf = en.nextElement(); for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements(); ) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress()) { return inetAddress.getHostAddress().toString(); } } } 

Yo no hago Android, pero me enfrentaría a esto de una manera totalmente diferente.

Envía una consulta a Google, algo así como: https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=my%20ip

Y consulte el campo HTML en el que se publica la respuesta. También puede consultar directamente a la fuente.

Google estará más allá de su aplicación.

Sólo recuerde, podría ser que su usuario no tiene Internet en este momento, ¿qué te gustaría que suceda?

Buena suerte

Basado en lo que he probado esta es mi propuesta

 import java.net.*; import java.util.*; public class hostUtil { public static String HOST_NAME = null; public static String HOST_IPADDRESS = null; public static String getThisHostName () { if (HOST_NAME == null) obtainHostInfo (); return HOST_NAME; } public static String getThisIpAddress () { if (HOST_IPADDRESS == null) obtainHostInfo (); return HOST_IPADDRESS; } protected static void obtainHostInfo () { HOST_IPADDRESS = "127.0.0.1"; HOST_NAME = "localhost"; try { InetAddress primera = InetAddress.getLocalHost(); String hostname = InetAddress.getLocalHost().getHostName (); if (!primera.isLoopbackAddress () && !hostname.equalsIgnoreCase ("localhost") && primera.getHostAddress ().indexOf (':') == -1) { // Got it without delay!! HOST_IPADDRESS = primera.getHostAddress (); HOST_NAME = hostname; //System.out.println ("First try! " + HOST_NAME + " IP " + HOST_IPADDRESS); return; } for (Enumeration<NetworkInterface> netArr = NetworkInterface.getNetworkInterfaces(); netArr.hasMoreElements();) { NetworkInterface netInte = netArr.nextElement (); for (Enumeration<InetAddress> addArr = netInte.getInetAddresses (); addArr.hasMoreElements ();) { InetAddress laAdd = addArr.nextElement (); String ipstring = laAdd.getHostAddress (); String hostName = laAdd.getHostName (); if (laAdd.isLoopbackAddress()) continue; if (hostName.equalsIgnoreCase ("localhost")) continue; if (ipstring.indexOf (':') >= 0) continue; HOST_IPADDRESS = ipstring; HOST_NAME = hostName; break; } } } catch (Exception ex) {} } } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.