Cómo obtener el IP del hotspot wifi en Android?

Como dice el título … Estoy tratando de ser capaz de obtener la IP de la iface wifi cuando se configura como hotspot. Idealmente, me gustaría encontrar algo que funcione para todos los teléfonos.

Por supuesto, el WifiManager es inútil cuando se trata de obtener información de la AP.

Afortunadamente, he podido obtener los IPs de todas las interfaces haciendo esto:

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()) { Log.d("IPs", inetAddress.getHostAddress() ); } } } } catch (SocketException ex) { Log.e(LOG_TAG, ex.toString()); } return null; } 

Este trozo de código imprimirá toda la IP de todas las interfaces (Wifi hotspot incluido). El principal problema es que no encuentro una manera de identificar la interfaz WiFi. Esto es un problema ya que algunos teléfonos tienen múltiples interfaces (WiMax, etc). Esto es lo que he probado hasta ahora:

  • Filtrado por el nombre de visualización wifi iface: no es un buen enfoque porque el nombre de visualización cambia de un dispositivo a otro (wlan0, eth0, wl0.1, etc).
  • Filtrado por su dirección MAC: casi el trabajo, pero en algunos dispositivos el iface hotspot no tiene una dirección MAC (iface.getHardwareAddress () devuelve null) … por lo que no es una solución válida.

¿Alguna sugerencia?

Esto es lo que hice para obtener el hotspot wifi:

 public String getWifiApIpAddress() { try { for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en .hasMoreElements();) { NetworkInterface intf = en.nextElement(); if (intf.getName().contains("wlan")) { for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr .hasMoreElements();) { InetAddress inetAddress = enumIpAddr.nextElement(); if (!inetAddress.isLoopbackAddress() && (inetAddress.getAddress().length == 4)) { Log.d(TAG, inetAddress.getHostAddress()); return inetAddress.getHostAddress(); } } } } } catch (SocketException ex) { Log.e(TAG, ex.toString()); } return null; } 

Esto le dará la dirección IP de cualquier dispositivo wifi, lo que significa que no es sólo para el hotspot. Si estás conectado a otra red wifi (lo que significa que no estás en modo hotspot), devolverá una IP.

Debe comprobar si está en modo AP o no. Puedes usar esta clase para eso: http://www.whitebyte.info/android/android-wifi-hotspot-manager-class

Puedes usar eso. No está probado, pero debería funcionar.

 ((WifiManager) mContext.getSystemService(Context.WIFI_SERVICE)).getDhcpInfo().serverAddress 

Esta es una posible solución que utiliza WiFiManager ConnectionInfo para encontrar NetworkInterface correspondiente.

Si sólo necesita la IP, entonces puede utilizar:

 WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); WifiInfo wifiInfo = wifiManager.getConnectionInfo(); int ipAddress = wifiInfo.getIpAddress(); 

Cuando el Wifi no está configurado como un hotspot, tiene un nombre android-xx7632x324x32423 casa cuando hotspot está activado, ese nombre se ha ido. También cambia la dirección IP.

Así que si usted es capaz de obtener la configuración Wifi antes de habilitar el hotspot, en primer lugar puede utilizar intf.getName() para obtener una referencia a él.

En segundo lugar, el IP cambiado, por lo que si sabe qué interfaz de wifi está en modo CONNECTED , puede utilizar esa información para identificarlo más tarde después de habilitar el hotspot.

A continuación se muestra un código que utilicé para depurar. Escupí todo lo que puedo encontrar, hacer un lío enorme y luego limpiarlo cuando descubrí mi problema. GL

 import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Collections; import android.net.ConnectivityManager; textStatus = (TextView) findViewById(R.id.textStatus); try { for (NetworkInterface intf : Collections.list(NetworkInterface.getNetworkInterfaces())) { for (InetAddress addr : Collections.list(intf.getInetAddresses())) { if (!addr.isLoopbackAddress()){ textStatus.append("\n\n IP Address: " + addr.getHostAddress() ); textStatus.append("\n" + addr.getHostName() ); textStatus.append("\n" + addr.getCanonicalHostName() ); textStatus.append("\n\n" + intf.toString() ); textStatus.append("\n\n" + intf.getName() ); textStatus.append("\n\n" + intf.isUp() ); } } } } catch (Exception ex) { textStatus.append("\n\n Error getting IP address: " + ex.getLocalizedMessage() ); } connectivity = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); allInfo = connectivity.getAllNetworkInfo(); mobileInfo = connectivity.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); textStatus.append("\n\n TypeName: " + mobileInfo.getTypeName()); textStatus.append("\n State: " + mobileInfo.getState()); textStatus.append("\n Subtype: " + mobileInfo.getSubtype()); textStatus.append("\n SubtypeName: " + mobileInfo.getSubtypeName()); textStatus.append("\n Type: " + mobileInfo.getType()); textStatus.append("\n ConnectedOrConnecting: " + mobileInfo.isConnectedOrConnecting()); textStatus.append("\n DetailedState: " + mobileInfo.getDetailedState()); textStatus.append("\n ExtraInfo: " + mobileInfo.getExtraInfo()); textStatus.append("\n Reason: " + mobileInfo.getReason()); textStatus.append("\n Failover: " + mobileInfo.isFailover()); textStatus.append("\n Roaming: " + mobileInfo.isRoaming()); textStatus.append("\n\n 0: " + allInfo[0].toString()); textStatus.append("\n\n 1: " + allInfo[1].toString()); textStatus.append("\n\n 2: " + allInfo[2].toString()); 
 private static byte[] convert2Bytes(int hostAddress) { byte[] addressBytes = { (byte)(0xff & hostAddress), (byte)(0xff & (hostAddress >> 8)), (byte)(0xff & (hostAddress >> 16)), (byte)(0xff & (hostAddress >> 24)) }; return addressBytes; } public static String getApIpAddr(Context context) { WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); DhcpInfo dhcpInfo = wifiManager.getDhcpInfo(); byte[] ipAddress = convert2Bytes(dhcpInfo.serverAddress); try { String apIpAddr = InetAddress.getByAddress(ipAddress).getHostAddress(); return apIpAddr; } catch (UnknownHostException e) { e.printStackTrace(); } return null; } 

Utilizo la solución de ajma, cambiando intf.getName().contains("wlan") a intf.getName().contains("wl") || intf.getName().contains("ap") intf.getName().contains("wl") || intf.getName().contains("ap") . Y funciona para muchos teléfonos móviles.

Pero devuelve nulo cuando acaba de conectarse a un WiFi.

  • Obtener estadísticas de tráfico wifi android
  • Dispositivo inalámbrico ADB no autorizado
  • Retraso / retraso enorme de UDP con Android
  • ¿Cómo comprobar si un dispositivo androide está equipado con un adaptador wifi?
  • Devolución de llamada en el dispositivo que se conecta a Wifi Hotspot
  • ¿Cómo determinar qué estándar es utilizado por wifi ap / network?
  • Cree un punto de acceso con el Nexus 7
  • Conecte Android a la red WiFi Enterprise EAP (PEAP)
  • Android: ¿Conectar dos teléfonos inalámbricamente?
  • ¿Se puede utilizar MulticastLock de Android para monitorear solicitudes de sondeo 802.11 desde otros dispositivos?
  • Adición de un nuevo portador de red a Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.