原生安卓WiFi信号叹号和叉的原因

  Captive Portal是安卓5引入的一种检测网络是否正常连接的机制,制作的非常有创意,通过HTTP返回的状态码是否是204来判断是否成功,如果访问得到了200带网页数据,那你就可能处在一个需要登录验证才能上网的环境里,比如说校园网,再比如说一些酒店提供的客户才能免费使用的WiFi(其实是通过DNS劫持实现的),如果连接超时(根本就连接不上)就在WiFi图标和信号图标上加一个标志,安卓5和6是叹号,安卓7改成一个叉了。只不过默认访问的是谷歌自家的验证服务器,然而由于你懂的原因,就算你连接上了网络也连不上这个服务器。
  谷歌设计了一个开关来控制是否启用这个特性,同时也提供了一个变量来控制待验证的服务器地址,国内的修改版ROM通常都改成了高通中国的地址,还有一些ROM设计了代码在重启的时候恢复这个设置。


以下需要ADB调试,配置不赘述

一. 5.0 - 6.x教程

5和6还不支持HTTPS,直接修改即可

  • 检测开关相关:
      先处理开关状态,这个变量删除就是默认开启的,删除操作随意执行,反正没影响,删除状态下获取这个变量会返回null。
    注意:如果关闭,则无法判断当前网络是否需要登录,无法自动弹出登录页面
    删除
    adb shell settings delete global captive_portal_server
    禁用
    adb shell settings put global captive_portal_server 0
    查询状态
    adb shell settings get global captive_portal_server
  • 服务器地址相关:
    删除地址就可以恢复默认的谷歌服务器
    adb shell settings delete global captive_portal_server
    设置一个可用地址(高通/V2EX都推荐)
    adb shell settings put global captive_portal_server captive.v2ex.co
    查询当前地址
    adb shell settings get global captive_portal_server

二. 7.0 - 7.1教程

  这两个版本相比5和6没有大的更改,只是默认连接服务器的时候使用HTTPS,但是提供了一个开关用以指定是否使用HTTPS

  • 检测开关相关:
    5.0 - 6.x
  • HTTPS开关相关:
    删除(直接删除则默认使用HTTPS)
    adb shell settings delete global captive_portal_use_https
    禁用HTTPS(写1启用 写0禁用)
    adb shell settings put global captive_portal_use_https 0
    查询HTTPS开关状态
    adb shell settings get global captive_portal_use_https
  • 服务器地址相关:
    (如果启用了HTTPS需要先确定地址是否支持HTTPS)
    5.0 - 6.x

三. 7.1.1教程

  这个版本把HTTPS和HTTP两个地址分开保存,并通过7.0加入的HTTPS开关来控制使用哪一个地址。

  • 检测开关相关:
    5.0 - 6.x
  • HTTPS开关相关:
    7.0 - 7.1
  • 服务器地址相关:
    删除(删除默认用HTTPS)
    adb shell settings delete global captive_portal_https_url
    adb shell settings delete global captive_portal_http_url
    分别修改两个地址
    adb shell settings put global captive_portal_http_url http://captive.v2ex.co/generate_204
    adb shell settings put global captive_portal_https_url https://captive.v2ex.co/generate_204

四. 7.1.2教程

  此版本服务器地址判断逻辑相比7.1.1没有更改,但是检测的开关却变了。

  • 检测开关:
    删除变量:(删除以后默认启用)
    adb shell settings delete global captive_portal_mode
    关闭检测:
    adb shell settings put global captive_portal_mode 0
    查看当前状态:
    adb shell settings get global captive_portal_mode
  • 服务器地址相关(同7.1.1):
    删除(删除默认用HTTPS)
    adb shell settings delete global captive_portal_https_url
    adb shell settings delete global captive_portal_http_url
    分别修改两个地址
    adb shell settings put global captive_portal_http_url http://captive.v2ex.co/generate_204
    adb shell settings put global captive_portal_https_url https://captive.v2ex.co/generate_204

五. Android8.0/8.1和9.0同上。