¿Cómo detecta WiFi en Android si el dispositivo tiene que iniciar sesión o no?

Cuando el dispositivo intenta conectarse a un punto de acceso o enrutador, debe iniciar sesión en la página del portal cautivo con el mensaje que dice

"Iniciar sesión en la red Wi-Fi".

¿Cómo identifica el punto de acceso/enrutador que se requiere un inicio de sesión para el dispositivo y cuál es el proceso detrás de esto?

Respuestas (3)

La URL de detección difiere entre las diferentes versiones de Android.

Para Marshmallow, usa connectionscheck.gstatic.com/generate_204, revisa el código aquí AndroidXRef - Marshmallow 6.0.0_r1

Para Kitkat, usa clients3.google.com/generate_204 verifique el código AndroidXRef - KitKat 4.4.4_r1

No quería secuestrar la respuesta editándola, así que dejaré un comentario. Me tomó un tiempo darme cuenta de que la URL de detección activa la notificación si no se puede alcanzar. Además, necesitaba mi punto de acceso para responder a esta solicitud con algún tipo de contenido; en mi caso, devolví un código 200 y la página de índice de mi servidor web cuando se solicita /generar_204. Sin contenido en la respuesta, independientemente del código de retorno, obtendría una notificación de "Wi-Fi no tiene acceso a Internet".
@ubomb Parece extraño, ya http://connectivitycheck.gstatic.com/generate_204que en realidad devuelve un 204 sin contenido y obviamente funciona. Tal vez simplemente omitió el Content-Length: 0encabezado.

Esta tecnología se llama "portal cautivo". Hay varias implementaciones. Como sé, Android intenta llegar a un archivo con nombre generate_204en uno de los servidores de Google y, si no es posible, se genera una notificación.

Lectura adicional en Wikipedia: Captive_portal

En realidad, sé sobre el portal cautivo. Pero sé la URL específica para comprobarlo. Quiero saber cómo es el trabajo. No lo que es.
¿Qué quieres decir con "cómo es el trabajo"? Android envía una solicitud, y si no hay una respuesta positiva, significa que no hay conexión a Internet y se genera una notificación. Asi es como funciona.
Cuál es la URL específica en la que solicita Android. Tengo mención en cuestión.
En tu comentario anterior dijiste que conoces la URL específica. creo que eshttps://www.gstatic.com/generate_204
La URL parece ser clients3.google.com/generate_204 . Información tomada de este sitio para cromo, que probablemente sea la misma para Android. chromium.org/chromium-os/chromiumos-design-docs/…
@Alex.S: No estoy seguro de si es relevante preguntar esto aquí, pero no pude encontrar un lugar adecuado. La pregunta es: como dijiste, 'hay varias implementaciones' del portal cautivo. Algunos devuelven una URL de redireccionamiento con un código de estado HTTP como 200/3XX/511 y otros devuelven una página HTML como tal. Los conozco, pero quería saber si encontró algún enlace que describa los tipos/métodos de implementación del portal cautivo. ¿Conoce algún conjunto de pruebas para verificar si la detección de portales cautivos cubre todos los tipos de portales?

Un portal cautivo generalmente se implementa dirigiendo todo el tráfico a una respuesta HTTP válida (200). Esta respuesta HTTP es lo que aparece en el portal cautivo.

Esto se puede hacer con herramientas como iptables o dnsmasq.