Obtener mi dirección IP wifi Android

¿Cómo puedo obtener la dirección IP de mi teléfono cuando está conectado bajo wifi?

Encontré un método aquí pero devuelve algo como 24.182.239.255 incluso si estoy bajo wifi y espero algo como 192.168.1.10.

Me gustaría algo como:

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

¡Muchas gracias!

Si desea obtener la dirección IP privada de su dispositivo cuando está conectado a Wi-Fi, puede probar esto.

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

Asegúrese de agregar el permiso

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

A su manifiesto.

Así que algo a considerar es que Formatter.formatIpAddress (int) está siendo obsoleto:

Este método fue obsoleto en el nivel 12. Use getHostAddress (), que soporta direcciones IPv4 e IPv6. Este método no admite direcciones IPv6.

Así que usar formatIpAddress(int) es probable que no sea una buena solución a largo plazo, aunque funcionará.

Aquí está una solución potencial si usted está mirando absolutamente en conseguir la dirección IP para el interfaz de 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; } 

Como se indicó en las respuestas anteriores, debe configurar lo siguiente en su AndroidManifest.xml :

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

Tenga en cuenta que esto es sólo un ejemplo de solución. Usted debe tomar tiempo para comprobar los valores nulos y así sucesivamente para asegurarse de que el UX es suave.

La ironía es que por un lado Google está desaprobando formatIpAddress(int) , pero todavía tiene getIpAddress () todavía devuelve un valor entero. La dirección IP que es un int también lo descarta por ser compatible con IPv6.

A continuación es el hecho de que endianness puede o no ser un problema. Sólo he probado tres dispositivos y todos han sido little-endian. Parece que endianness puede variar dependiendo del hardware, aunque estamos corriendo en VMs esto todavía puede ser un problema. Así que para estar en el lado seguro agregé un cheque endian en el código.

GetByAddress (byte []) parece querer que el valor entero sea endian grande. De la investigación de esto parece que el orden de los bytes de la red es grande-endian. Tiene sentido ya que una dirección como 192.168.12.22 es un número de big-endian.


Consulta el proyecto HammerNet GitHub. Implementa el código anterior junto con un montón de controles de sanidad, la capacidad de manejar los valores predeterminados para AVD, pruebas de unidad y otras cosas. Tuve que implementar esto para una aplicación mía y decidí abrir la biblioteca de código fuente.

Esto le proporcionará el IPv4 WiFi, IPv6 o ambos.

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

Uso:

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

Y no olvide:

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

Si adb está instalado en el terminal, haga lo siguiente:

 Runtime.getRuntime.exec("adb", "shell", "getprop", "dhcp.wlan0.ipaddress"); 

Según mis registros de bloqueo, parece que no todos los dispositivos devuelven la dirección MAC de WiFi.

Aquí está una versión más limpia de la respuesta más popular.

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

Formatter.formatIpAddress (int) está obsoleto:

 WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE); String ipAddress = BigInteger.valueOf(wm.getDhcpInfo().netmask).toString(); 
  • Obtener flujo de vídeo IP Cam en Android (MJEPG)
  • Obtener la ubicación de wifi ip en android
  • Recurso IP en android
  • Android desconocidoHostException Facebook SDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.