我的 Pixel 手机连接国内 Wi-Fi 后,一直显示:
已连接,但无法访问互联网
Connected, no internet
网络连接受限
这类问题通常不是 Wi-Fi 本身损坏,而是 Pixel 使用的 Android 网络连通性检测地址在当前网络环境下无法正常访问。它默认的地址是国外的,国内无法访问导致。
最终我通过 1Panel 和 Nginx 自建了一个 generate_204 检测地址,再用 ADB 修改 Pixel 的 Captive Portal 配置,成功解决了这个问题。
本文记录完整的成功过程。
一、原理说明
Android 连接 Wi-Fi 后,会请求一个网络检测地址。
如果该地址直接返回:
1 | HTTP 204 No Content |
系统就会认为当前 Wi-Fi 可以正常访问互联网。
如果检测地址无法访问,或者返回了下面这些状态:
1 | 301 |
Android 就可能认为当前 Wi-Fi:
- 无法访问互联网;
- 网络连接受限;
- 需要进行网页认证;
- 只能部分联网。
因此,自建检测地址时最重要的要求是:
1 | HTTP 地址直接返回 204 |
我最终使用的检测域名是:
1 | wifi.mcpq.cc |
完整地址:
1 | http://wifi.mcpq.cc/generate_204 |
也可以直接用我部署的这个。
二、准备条件
需要准备:
- 一台安装了 1Panel 的服务器;
- 一个已经解析到服务器的域名;
- Pixel 手机;
- 一台 Windows 电脑;
- Android Platform Tools;
- Pixel 已开启开发者选项和 USB 调试。
我的 ADB 路径是:
1 | C:\Apps\KaiFaHuanJin\platform-tools |
我的检测域名是:
1 | wifi.mcpq.cc |
三、配置域名解析
在域名 DNS 中添加一条记录:
1 | 类型:A |
最终解析结果:
1 | wifi.mcpq.cc |
如果域名托管在 Cloudflare,需要注意:
1 | 代理状态:仅 DNS |
也就是灰色云朵。
不要让该子域名经过 Cloudflare 橙色云代理,否则 Cloudflare 的强制 HTTPS、WAF、质询或重定向规则可能影响 generate_204 的返回结果。
四、在 1Panel 创建网站
进入 1Panel:
1 | 网站 |
域名填写:
1 | wifi.mcpq.cc |
创建完成后,为该网站申请 HTTPS 证书。
需要注意:
1 | 不要开启强制 HTTPS |
因为 Android 的 HTTP 检测地址也必须直接返回 204。
五、修改 Nginx 配置
完整配置如下:
1 | server { |
保存配置后,1Panel 会自动检查并重载 Nginx。
六、验证检测地址
在 Windows CMD 中执行:
1 | curl.exe -s -o NUL -w "HTTP=%{http_code} REDIRECT=%{redirect_url}\n" http://wifi.mcpq.cc/generate_204 |
我的返回结果:
1 | HTTP=204 REDIRECT= |
再测试 HTTPS:
1 | curl.exe -s -o NUL -w "HTTP=%{http_code} REDIRECT=%{redirect_url}\n" https://wifi.mcpq.cc/generate_204 |
返回:
1 | HTTP=204 REDIRECT= |
这说明:
- HTTP 返回 204;
- HTTPS 返回 204;
- 两个地址都没有重定向;
- 检测服务配置正确。
还可以检查响应体大小:
1 | curl.exe -sS -o NUL -w "CODE=%{http_code} BODY=%{size_download} REDIRECT=%{redirect_url}\n" http://wifi.mcpq.cc/generate_204 |
理想结果:
1 | CODE=204 BODY=0 REDIRECT= |
其中:
1 | CODE=204 |
表示状态码正确。
1 | BODY=0 |
表示没有返回正文。
1 | REDIRECT= |
表示没有发生重定向。
七、Pixel 开启 USB 调试
进入 Pixel:
1 | 设置 |
开启开发者选项后,进入:
1 | 设置 |
如果手机弹出 USB 调试授权提示,勾选:
1 | 始终允许使用这台计算机进行调试 |
然后点击允许。
八、确认 ADB 已识别 Pixel
进入 ADB 工具目录:
1 | cd /d C:\Apps\KaiFaHuanJin\platform-tools |
执行:
1 | adb devices |
一开始我的设备列表为空:
1 | List of devices attached |
重新连接手机、开启文件传输并确认 USB 调试授权后,再次执行:
1 | adb devices |
成功显示:
1 | List of devices attached |
只要状态是:
1 | device |
就说明 ADB 已经连接成功。
九、查看 Pixel 当前的检测地址
执行:
1 | adb shell settings get global captive_portal_http_url |
返回:
1 | http://wifi.joyb.cc/generate_204 |
这是我之前配置的旧地址,你的应该是空的或者其它类似。
查看 HTTPS:
1 | adb shell settings get global captive_portal_https_url |
返回:
1 | https://wifi.joyb.cc/generate_204 |
查看检测模式:
1 | adb shell settings get global captive_portal_mode |
返回:
1 | null |
这说明手机中还保留着以前设置的旧域名,并且没有手动设置检测模式。
十、修改为新的检测地址
执行:
1 | adb shell settings put global captive_portal_http_url http://wifi.mcpq.cc/generate_204 |
执行:
1 | adb shell settings put global captive_portal_https_url https://wifi.mcpq.cc/generate_204 |
再启用正常检测模式:
1 | adb shell settings put global captive_portal_mode 1 |
这里的:
1 | 1 |
表示启用 Android 正常的 Captive Portal 网络检测。
十一、确认配置写入成功
执行:
1 | adb shell settings get global captive_portal_http_url |
最终返回:
1 | http://wifi.mcpq.cc/generate_204 |
说明配置已经成功写入。
十二、重启 Pixel
执行:
1 | adb reboot |
手机重启后:
1 | 关闭移动数据 |
重新连接后,Pixel 不再显示:
1 | 已连接但无法访问互联网 |
至此问题解决。
十四、本次完整命令
检查检测地址
1 | curl.exe -s -o NUL -w "HTTP=%{http_code} REDIRECT=%{redirect_url}\n" http://wifi.mcpq.cc/generate_204 |
连接 Pixel
1 | cd /d C:\Apps\KaiFaHuanJin\platform-tools |
查看当前配置
1 | adb shell settings get global captive_portal_http_url |
写入自建地址
1 | adb shell settings put global captive_portal_http_url http://wifi.mcpq.cc/generate_204 |
验证配置
1 | adb shell settings get global captive_portal_http_url |
重启手机
1 | adb reboot |
captive_portal_mode 返回 null
执行:
1 | adb shell settings get global captive_portal_mode |
返回:
1 | null |
表示没有人为写入该配置,系统使用默认模式。
为了明确启用,我最终执行:
1 | adb shell settings put global captive_portal_mode 1 |
十六、恢复系统默认设置
以后如果想恢复 Android 默认设置,连接 ADB 后执行:
1 | adb shell settings delete global captive_portal_http_url |
重启后,系统会重新使用默认的网络检测配置。
最终结果
最终配置:
1 | 检测域名:wifi.mcpq.cc |
Pixel 重启并重新连接 Wi-Fi 后,“已连接但无法访问互联网”的提示成功消失。
这次解决问题的关键不是单纯修改 ADB 地址,而是先确保自建的检测服务满足:
1 | HTTP 直接返回 204 |
只有服务端和 Pixel 端都配置正确,Android 的联网检测才能正常通过。
评论