背景
从Android 5.0 (Lollipop)开始,安卓为了检测各种需要登录的Wifi服务,提供了captive_portal_detection_enabled
和captive_portal_server
这两个设置,分别作为检测的开关和服务器。原理是访问http://<server>/generate_204
这个URL:
- 如果返回204,就说明wifi可以直接连接,不需要登录;
- 如果返回非204并且非空的内容,说明wifi需要登录。
默认的服务器是被墙的google的服务器,所以总是检测不正确,导致出来感叹号。
具体情况可以参看小狐狸的这篇文章,里面详细介绍了原理,以及如何设置墙内的服务器。
问题
不过,从Android 7.0 (Nougat)开始,这个设置稍微有点变化,在某些服务器上会导致又出现感叹号,这里介绍一下。
Android 7.0 引入了一个新的设置:CAPTIVE_PORTAL_USE_HTTPS
(captive_portal_use_https
),默认值是1,也就是说,默认情况,它会用https://<server>/generate_204
这个URL来判断isCaptivePortal()
。
具体的code请移步NetworkMonitor.java#285
假如原来的服务器不支持HTTPS,或者支持了HTTPS但是这个URL没有返回204,都会导致感叹号的问题。
解决
所以解决问题的方式也很简单:
- 要么配置墙内的服务器,让它在https的情况也也返回204;
- 要么在手机上把HTTPS的值设为0 (
settings put global captive_portal_use_https 0
)
比如说,V2EX刚提供了captive.v2ex.co
这个URL,同时支持HTTP和HTTPS。
本站也提供http://ping.mine260309.me/generate_204
和https://mine260309.me/generate_204
这两个URL。
更新
升级到7.1.1之后,会发现感叹号(或者x号)又出现了。
感谢@tedjiang的comment,解决办法是:
settings put global captive_portal_https_url https://captive.v2ex.co/generate_204