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.
- La aplicación nunca recibe RSSI_CHANGED_ACTION
- ¿Por qué WiFiP2P necesita permiso de Internet?
- Android Wifi Direct detecta a sus compañeros pero Peer List es emty
- ¿Qué pasará con las conexiones existentes cuando cambie entre 3g / wifi
- Conexión WiFi a través de Android
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?
- hostapd & rpbi portal cautivo
- Android 6.0 comprueba si está conectado a una red Wi-Fi (sin Internet)
- Android - detección si wifi es WEP, WPA, WPA2, etc. programáticamente
- Aumento de la velocidad de análisis WiFi
- Compruebe si la red ScanResult ya está configurada (existe en la lista getConfiguredNetworks ())
- Android wifi permiso
- ¿Utiliza simultáneamente wifi y la interfaz 3G en Android?
- ¿Permitir que dos dispositivos se vean en Android usando la interfaz wifi?
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.
- Pérdida de memoria android en el servicio de notificación
- Uso de texto de Android como etiqueta y valor