android captive portal

文章介绍了Android系统如何使用isCaptivePortal()函数检测WiFi是否需要验证,通过访问http://clients3.google.com/generate_204获取HTTP204响应。当该网址被墙或者需要登录时,系统会显示不同的响应。为解决这个问题,作者提出将验证URL改为国内可用的小米地址以避免网络问题,并详细说明了如何通过ADB设置captive_portal_mode来控制检测行为。

想必大家都连接过那些需要验证才能使用的wifi热点吧,当你们连接这些热点的时候,android会自动弹出提示询问你是否需要登录。而这个功能就是依靠了 isCaptivePortal() 这个函数才得以实现,具体原理如下:

安卓先访问 http://clients3.google.com/generate_204 这个网址,而这个网址如字面所说,会产生一个 http 204 返回值。204返回值的意思就是空内容。如果当前wifi是需要登录才可以连接,那么当试图访问google的服务器的时候,wifi的验证机制一定会自动跳转到一个登录页面,这个时候http请求的返回值就必然不是204了。就是通过这一机制,便可以区分当前wifi是否需要验证,不得不佩服想出这个办法的人来。

然而这就导致了如果简单的屏蔽掉这个函数的功能,那么就没有办法自动提示登录了,但是如果不屏蔽掉那么这个网址被墙掉了,因此会有一个难看的感叹号。想来想去我想到了一个曲线救国的办法,那就是我们把这个网址改成国内的网址不就可以了?我选用小米的这个地址,因为小米的这个地址网络延时是做小的,可以这样设置:

adb shell settings put global captive_portal_http_url http://connect.rom.miui.com/generate_204

adb shel settings put global captive_portal_https_url https://connect.rom.miui.com/generate_204

设置captive_portal_mode

系统默认的设置是1

  adb shell settings put global captive_portal_mode 0

   mode的取值如下:

  • 0:彻底禁用检测(Don’t attempt to detect captive portals.)
  • 1:检测到需要登录则弹窗提醒(默认值)(When detecting a captive portal, display a notification that prompts the user to sign in.)
  • 2:检测到需要登录则自动断开此热点并不再自动连接(When detecting a captive portal, immediately disconnect from the network and do not reconnect to that network in the future.

删除配置

adb shell settings delete global captive_portal_mode 0

 

 

### 如何在Android设备上关闭Captive Portal联网检测 在Android设备上,Captive Portal联网检测是一种机制,用于检测用户是否连接到需要登录的网络(例如公共Wi-Fi热点)。可以通过修改系统设置或源代码来禁用此功能。 #### 方法一:通过系统设置禁用Captive Portal检测 从Android系统的全局设置中,可以调整`Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED`参数以禁用Captive Portal检测。该参数控制是否启用Captive Portal检测功能[^2]。以下是具体实现方式: 1. 使用`adb shell`命令访问设备的shell环境。 2. 执行以下命令将Captive Portal检测功能设置为禁用状态: ```bash settings put global captive_portal_detection_enabled 0 ``` 这条命令会将`captive_portal_detection_enabled`的值设置为`0`,从而彻底禁用Captive Portal检测功能。 #### 方法二:通过修改源代码禁用Captive Portal检测 如果拥有Android系统的源代码访问权限,可以通过修改`NetworkMonitor.java`文件中的逻辑来永久禁用Captive Portal检测功能[^3]。以下是具体步骤: 1. 打开源代码路径`frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java`。 2. 修改以下代码段: ```java // Original code: mIsCaptivePortalCheckEnabled = Settings.Global.getInt( mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 1) == 1; // Modified code: mIsCaptivePortalCheckEnabled = false; ``` 将`mIsCaptivePortalCheckEnabled`直接设置为`false`,从而禁用Captive Portal检测功能[^3]。 3. 编译并刷入修改后的系统镜像。 #### 注意事项 - 修改系统设置的方法适用于普通用户,无需编译源代码即可快速实现功能禁用。 - 修改源代码的方法需要具备Android系统的编译环境和刷机能力,适合开发者或高级用户使用。 - 禁用Captive Portal检测可能会导致无法检测到需要登录的网络,因此需谨慎操作。 ```python # 示例代码:通过Python脚本调用ADB命令禁用Captive Portal检测 import subprocess def disable_captive_portal_detection(): try: subprocess.run(["adb", "shell", "settings", "put", "global", "captive_portal_detection_enabled", "0"], check=True) print("Captive Portal detection has been disabled successfully.") except subprocess.CalledProcessError as e: print(f"Error occurred: {e}") disable_captive_portal_detection() ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值