图标下面的感叹号和叉到底是什么意思
先分清两个容易混淆的标记
安卓系统里跟网络状态有关的图标标记,其实不止一个:
- 信号图标下方的 × 或 !——这是 Captive Portal 检测挂的。CaptiveMgr 处理的就是这个。
- 信号图标上方的 ×——这是安卓 7(Android N)加入的「移动数据开关状态」提示,表示当前没开蜂窝数据。跟探测无关,CaptiveMgr 也管不着。
搞清楚是哪一个再动手——上方的叉你找 CaptiveMgr 没用。
感叹号的来源:系统后台悄悄跑的一次探测
安卓从 5.0(Lollipop)起引入了 Captive Portal 检测机制。它的工作方式很简单:
- 系统在后台悄悄地发一个 HTTP 请求到某个固定地址
- 期望服务器返回 HTTP 204(无内容)
- 收到 204 → 判定「有网」,图标干净
- 收到 302 重定向或任何非 204 → 判定「可能被强制门户拦截了」,先挂个标记
这套机制的初衷是帮助用户在校园网、酒店 WiFi 这类强制门户网络里快速发现「需要先网页登录」。但副作用是:默认探测地址指向谷歌自己的服务器,在大陆直连不上,探测一直失败,哪怕你正在刷视频,系统也认定「没有网络」。
为什么叫 Captive Portal
这个词直译是「强制门户」——指的是公共场所 WiFi 那种一连上就自动弹网页要求登录的网络(校园网、酒店、公共 WiFi)。安卓在 5.0 之前对这种网络没什么处理能力,用户只能自己手动打开一个网页去触发登录页。Captive Portal 检测就是为此设计的一套自动机制。
CaptiveMgr 的处理思路
CaptiveMgr 不碰 DNS、不写 hosts、不装自定义证书。它的做法是:
- 换服务器——把探测地址换成国内可达的服务器(小米、华为、高通等)
- 或关掉检测——彻底停用这套探测,代价是遇到强制门户网络需要手动触发登录页
- 刷新图标——改完之后让系统重新探测一次,看结果
三条路对应三种需求:大多数人选第一种,嫌麻烦的选第二种,都满足不了就去看「进阶对比」。
相关页面
这套机制在不同安卓版本里参数名不完全一样,参见「安卓版本参数变化」。国产 ROM 为什么几乎不会出现这个问题,参见「国产ROM为什么不需要」。