测试机打开Wi-Fi,连接至Test,关闭Wi-Fi再打开后不能自动重连至Test(其他open AP可以自动重连)

1 测试步骤

  1. 测试机打开Wi-Fi,连接至Test(为需要网页认证才能够使用的Wi-Fi)
  2. 测试机在保持Test连接情况下,关闭Wi-Fi再打开

2 测试结果

步骤2中,测试机不能自动重连至Test

3 预期结果

步骤2中,测试机可以自动重连至Test

4 调查过程

4.1 NetworkMonitor.java::private class EvaluatingState extends State

......
int httpResponseCode = isCaptivePortal();
if (httpResponseCode == 204) {transitionTo(mValidatedState);
} else if (httpResponseCode >= 200 && httpResponseCode <= 399) {transitionTo(mCaptivePortalState);
}
......

4.2 NetworkMonitor.java::protected int isCaptivePortal()

......
validationLog("isCaptivePortal: ret=" + httpResponseCode +" headers=" + urlConnection.getHeaderFields());
......

如上打印如下的log

11-28 19:22:06.682  3474  7290 D NetworkMonitor/NetworkAgentInfo [WIFI () - 101]: isCaptivePortal: ret=200 headers={null=[HTTP/1.1 200 OK], Content-Length=[488],Content-Type=[text/html], Location=[https://sprdwlc.spreadtrum.com/fs/customwebauth/login.html ? switch_url=https://sprdwlc.spreadtrum.com/login.html&ap_mac=64:f6:9d:66:3c:20&client_mac=40:45:da:c1:87:2c&wlan=Test&redirect=connectivitycheck.gstatic.com/generate_204], X-Android-Received-Millis=[1480332126681], X-Android-Response-Source=[NETWORK 200], X-Android-Selected-Protocol=[http/1.1], X-Android-Sent-Millis=[1480332126662]}

4.3 NetworkMonitor.java::private class CaptivePortalState extends State

......
public void enter() {mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED,NETWORK_TEST_RESULT_INVALID, 0, mNetworkAgentInfo));
......

4.4 ConnectivityService.java::case NetworkMonitor.EVENT_NETWORK_TESTED:

......
final boolean valid =(msg.arg1 == NetworkMonitor.NETWORK_TEST_RESULT_VALID);
......// Let the NetworkAgent know the state of its network
nai.asyncChannel.sendMessage(android.net.NetworkA从如下的log开始:gent.CMD_REPORT_NETWORK_STATUS,(valid ? NetworkAgent.VALID_NETWORK : NetworkAgent.INVALID_NETWORK),0, null);
......

4.5 WifiStateMachine.java::protected void networkStatus()

.....
mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0) == 1;
if (status == NetworkAgent.INVALID_NETWORK) {if (DBG) log("WifiNetworkAgent -> Wifi networkStatus invalid, score="+ Integer.toString(mWifiInfo.score));unwantedNetwork(NETWORK_STATUS_UNWANTED_VALIDATION_FAILED);
}
.....

4.6 WifiStateMachine.java:void unwantedNetwork()

......
sendMessage(CMD_UNWANTED_NETWORK, reason);
......

4.7 WifiStateMachine.java::case CMD_UNWANTED_NETWORK:

......
} else if (message.arg1 == NETWORK_STATUS_UNWANTED_DISABLE_AUTOJOIN ||message.arg1 == NETWORK_STATUS_UNWANTED_VALIDATION_FAILED) {config = getCurrentWifiConfiguration();if (config != null) {// Disable autojoinif (message.arg1 == NETWORK_STATUS_UNWANTED_DISABLE_AUTOJOIN) {config.validatedInternetAccess = false;// Clear last-selected status, as being last-selected also avoids// disabling auto-join.if (mWifiConfigStore.isLastSelectedConfiguration(config)) {mWifiConfigStore.setLastSelectedConfiguration(WifiConfiguration.INVALID_NETWORK_ID);}}config.numNoInternetAccessReports += 1;config.dirty = true;mWifiConfigStore.writeKnownNetworkHistory(false);}
}
.....

4.8 WifiAutoJoinController.java ::boolean attemptAutoJoin()

最终在AutoConnet的时候在如下的地方被退出.没有进行AutoConnect.

// NOTE: If this condition is updated, update NETWORK_STATUS_UNWANTED_DISABLE_AUTOJOIN.
if (config.numNoInternetAccessReports > 0&& !isLastSelected&& !config.validatedInternetAccess) {// Avoid autoJoining this network because last time we used it, it didn't// have internet access, and we never manage to validate internet access on this// network configurationif (DBG) {logDbg("attemptAutoJoin skip candidate due to no InternetAccess  "+ config.configKey(true)+ " num reports " + config.numNoInternetAccessReports);}continue;
}
如上打印出如下的log:
11-28 19:22:28.378  3474  5227 D WifiAutoJoinController : attemptAutoJoin() num recent config 1 ---> suppNetId=-1
11-28 19:22:28.378  3474  5227 D WifiAutoJoinController : attemptAutoJoin good candidate seen, bumped hard -> status="Test"NONE status=0
11-28 19:22:28.378  3474  5227 D WifiAutoJoinController : attemptAutoJoin skip candidate due to no InternetAccess  "Test"NONE num reports 1
11-28 19:22:28.378  3474  5227 D WifiAutoJoinController : attemptRoam not associated

5 解决方案

如果需要关闭网络可用性检测.请修改"captive_portal_detection_enabled"的默认值为0.

NetworkMonitor.java :: public NetworkMonitor()mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0) == 1;

Android Wi-Fi 自动连接至需要网页认证AP失败相关推荐

  1. android ble 实现自动连接,Android:自动重新连接BLE设备

    经过多次试验和磨难之后,这就是我最好让Android自动连接的唯一用户操作是首先选择设备(如果使用设置菜单然后首先配对). 您必须将配对事件捕获到BroadcastReceiver中并执行Blueto ...

  2. android系统蓝牙自动连接

    实现的主要功能(蓝牙配对成功如何与远程设备一直连接) 1.当蓝牙配对成功连接时,非主动断开会自动连接 2.当设备长时间锁屏会导致CachedBluetoothDevice自动清空,如果蓝牙断开就不会自 ...

  3. android wifi取消自动连接网络,Android 11新增无线网络连接安全策略 可以不自动连接某些特定WiFi...

    多数网络设备在初次连接某个无线网络后会记住密码并在下次自动连接,对多数用户来说这可能是比较好的策略. 毕竟这样不需要用户下次主动查询无线网络再连接,不过苹果倒是很早就在iOS 里提供不自动连接无线网的 ...

  4. Android P WiFi自动连接评分机制

    1.WifiConnectivityManager的初始化 frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiState ...

  5. android开发蓝牙自动连接电脑上,android – 配对设备的蓝牙自动连接

    我是新来的,我已经阅读了很多你的帖子,但仍然没有找到问题的解决方案. 我正在为Android 2.2编写一个使用蓝牙连接到终端设备的应用程序. 我有一个配对设备列表,我可以将我的Android平板电脑 ...

  6. android开发蓝牙自动连接电脑上,Android蓝牙开发之自动连接设备

    自动连接使用的是SharedPreferences这个来解决. private void Automaticconnection() { SharedPreferences sp = getShare ...

  7. android安装自动打开网页,Android调用系统自带浏览器打开网页的实现方法

    Android调用系统自带浏览器打开网页的实现方法 在Android中可以调用自带的浏览器,或者指定一个浏览器来打开一个链接.只需要传入一个uri,可以是链接地址. 启动android默认浏览器 在A ...

  8. 转-Android中自动连接到指定SSID的Wi-Fi

    最近在做一个项目,其中涉及到一块"自动连接已存在的wifi热点"的功能,在网上查阅了大量资料,五花八门,但其中一些说的很简单,即不能实现傻瓜式的拿来就用,有些说的很详细,但其中不乏 ...

  9. android p wifi一直在扫描_Android Wifi 扫描及自动连接

    缘起 最近有个需求,要求App能够自动扫描到某个热点然后自动连接上热点.背景是我们公司属于IoT行业,这个热点是设备发出的,有固定的前缀(比如设备热点名为SmartLife-xx),可以直接连接无需密 ...

最新文章

  1. pyssdeep模块
  2. liunx使用ssh免密登录
  3. 教你用 Netty 实现一个简单的 RPC!
  4. .exe已停止工作_【PS课堂】你的photoshop已停止工作了,文件未保存该怎么办?
  5. [数据库] Navicat for MySQL定时备份数据库及数据恢复
  6. POJ - 1050 To the Max(最大连续子段和,线性dp)
  7. Redis功能强大,那也顶不住被滥用啊!
  8. vs2010常见错误记录
  9. 【计算机组成原理】Cache
  10. 开源游戏《一小时人生》GitHub仓库被删,CEO亲自道歉
  11. 深入浅出node.js游戏服务器开发1——基础架构与框架介绍
  12. CNN:Channel与Core的高H、宽W的权值理解
  13. python函数支持哪些参数类型_如何记录python函数参数类型?
  14. (转)投资AI的核心标准是场景和数据
  15. 您需要 TrustedInstaller 提供的权限才能对此文件进行更改
  16. 设计大赛现场统分系统(C语言)
  17. Linux下护眼软件
  18. T32使用-----抓取rpm dump
  19. 服务器开机必须要按f1才能进系统,教你为什么开机必须按F1才能进入系统
  20. python气泡图的地图_基于Python图表绘图系统:matplotlib散点图和气泡图,你了解吗?...

热门文章

  1. 身份云为什么? 浅谈身份认证与FIDO
  2. 拯救者R9000p加装固态后画面卡顿问题
  3. solidity-antlr4
  4. 微信小程序计算机维修服务+后台管理系统前后分离VUE|计算机毕业设计|计算机维修服务|微信小程序|
  5. 10行代码,实现写诗机器人
  6. canvas-绘制功能
  7. 碳通宝丨绿色经济将成为应对经济衰退的利剑
  8. 大数据项目实战-招聘网站职位分析
  9. 基于Java健身房管理系统设计实现(源码+lw+部署文档+讲解等)
  10. enclosing type java_java中no enclosing instance of type * is accessible的解决方法