C'était douloureux, mais j'ai trouvé la solution :
Lorsqu'Android se connecte à un nouveau réseau, il essaie de détecter automatiquement s'il peut effectivement atteindre l'internet via ce réseau. Si ce n'est pas le cas, il affiche une fenêtre de navigateur et ouvre une adresse http aléatoire dans l'espoir de faire apparaître le portail captif du réseau (par exemple, la page de connexion wifi de votre hôtel, etc.)
La détection se fait en demandant http://clients3.google.com/generate_204
(ou similaire) et s'attendre à une certaine réponse. (Je n'ai délibérément pas transformé cette adresse en lien, parce que si vous essayez de l'ouvrir, rien ne se passe comme il retourne HTTP Status 204: No Content
que la plupart des navigateurs ignorent).
Ma confusion venait du fait que j'avais un serveur HTTP en cours d'exécution pour servir cette réponse et que j'avais un serveur DNS configuré pour diriger la demande vers ce serveur. Mais le serveur ne recevait aucune requête de ce téléphone particulier (les autres téléphones Android fonctionnaient).
Il s'avère que ce téléphone particulier fait deux choses différentes :
- Il désactive simplement le WiFi au lieu de faire apparaître la page du portail captif si aucun réseau n'est détecté, ce qui rendait vraiment difficile de comprendre ce qui se passait.
- Il n'a pas utilisé de recherche DNS pour
clients3.google.com
mais il a utilisé une adresse IP codée en dur !
Donc, j'ai finalement pu résoudre le problème en mettant en place un fichier de type iptables
-qui transmet simplement toutes les requêtes HTTP à mon serveur HTTP, quelle que soit l'IP à laquelle elles sont destinées. Après cela, le téléphone a obtenu son generate_204
-réponse et tout a fonctionné comme prévu...