ver una samsung saber puerta estar enlace direccion desde conectado como celular android ip android-wifi android-networking

una - Obtener mi dirección IP wifi Android



mi ip (9)

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

Encontré un método here pero devuelve algo así como 24.182.239.255 incluso si estoy bajo wifi y espero algo así 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!


Agregue los siguientes permisos.

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

WifiManager se inicializa en onCreate.

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

Use la siguiente función.

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


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

Este método quedó obsoleto en el nivel 12 de API. Utilice getHostAddress (), que admite direcciones IPv4 e IPv6. Este método no admite direcciones IPv6.

Entonces, el uso de formatIpAddress(int) probablemente no sea una buena solución a largo plazo, aunque funcionará.

Aquí hay una solución potencial si buscas absolutamente obtener la dirección IP para la interfaz 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 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 solo una solución de ejemplo. Debería tomarse un tiempo para verificar valores nulos y demás para asegurarse de que el UX sea fluido.

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

Lo siguiente es el hecho de que la endianidad puede o no ser un problema. Solo he probado tres dispositivos y todos han sido little-endian. Parece que la endianidad puede variar según el hardware, aunque estamos trabajando en máquinas virtuales esto todavía puede ser un problema. Así que para estar seguro añadí un cheque endian en el código.

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

Vea el proyecto HammerNet GitHub. Implementa el código anterior junto con un conjunto de verificaciones de cordura, capacidad para manejar valores predeterminados de AVD, pruebas unitarias y otras cosas. Tuve que implementar esto para una aplicación mía y decidí abrir la biblioteca de código abierto.


El siguiente código es de la configuración de AOSP. Obtiene la dirección IP del enlace activo, no importa wifi o móvil. Es la forma más común.

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


En función de mis registros de fallos, parece que no todos los dispositivos devuelven la dirección MAC de WiFi.

Aquí hay 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? }


Encontré esta buena respuesta, 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));


Esto te dará WiFi IPv4, 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 lo olvides

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


Formatter.formatIpAddress (int) está en desuso:

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


Si adb está instalado en el terminal, entonces hazlo:

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


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

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

Asegúrate de agregar el permiso

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

a tu manifiesto