Android で Wi-Fi のインターネットアクセスが検出できない場合に自動接続が効かなくなってしまう問題とその対処

1 min read読了の目安(約1400字

Android 端末上で、Wi-Fi への接続時において、特定のアクセスポイントに自動接続する設定を enabled にしていても、当該の AP がインターネットに接続されていない場合、その AP への自動接続が失敗してしまう、というケースがあります。


こういう状態

これが問題になる場面はそうめったには訪れないかもしれませんが、たとえば、業務用のキオスクデバイスとして稼働させている Android が、別の端末とローカルネットワーク内で通信しているケースにおいて、一度ネットワークから外れてしまうと、手動で再度繋ぎなおさない限り、通信に失敗してしまう、ということが起こりえます。運用の観点からすると、手動で繋ぎなおす手間はなるべく省きたいものです。

対策

シンプルですが、下記の adb コマンドを実行して、端末を再起動することで解決できます(Android 11 で確認済)。

// Android 7 以降
$ adb shell settings put global captive_portal_mode 0

// Android 6 以前
$ adb shell settings put global captive_portal_detection_enabled 0

この設定をもとに戻す場合は、以下のコマンドを実行します。

// Android 7 以降
$ adb shell settings put global captive_portal_mode 1

// Android 6 以前
$ adb shell settings put global captive_portal_detection_enabled 1

何が起きているのか

上記のコマンドで、Captive Portal Detection を無効にすることによって、自動接続されない問題に対処していますが、そもそも Captive Portal Detection とはいったい何なのか、という疑問が残ります。

それに関しては、下記の記事が詳しいです。

https://ao780.hateblo.jp/entry/2017/02/21/112233

この記事によれば、端末が任意のアクセスポイントに接続する時、ある特定の Web ページへのアクセスを試みることによって、その AP がインターネットにアクセスできるかどうかを検出する、という仕組みが iOS や Android には備わっています(Android の場合は、Google のサーバ内にレスポンスコード 204 のみを返す Web ページが存在し、そのレスポンスによって上記を判定しています)。この仕組みを Captive Portal Detection といい、ここで、インターネット接続がないと判断された AP は自動接続の対象から外される仕様になっているようです。

参考

https://github.com/ukanth/afwall/issues/761