此文章原文连接:https://blog.csdn.net/XCF95319605/article/details/81258834
来自博主:Felix1120

Android8.0 连接需要认证的WIFI或不可用的WIFI后自动断开数据流量连接的实现
前言:Google原生对Android系统的设计为,当用户接入一个可以正常上网的WIFI网络以后,会自动切断数据流量的链接,但是,若当用户接入了一个需认证的WIFI,如:机场或运营商提供的连接后需要进行登录验证身份的WIFI时,当跳转到认证界面(特定的webview界面)受安全限制而自动使用浏览器打开时,浏览器就会走数据通道而导致不能认证,而用户就会误以为在使用WIFI上网(因为此时的WIFI仍处于连接状态,但实际不能上网),或者用户接入了一个不能正常上网的WIFI,那么也会默认走数据流量通道,从而给用户造成一种误解,误以为在使用WiFi网络而造成流量费。

那么,如何实现当用户接入了一个非正常状态的WIFI时断开数据链接给防止用户不知情的情况下使用数据流量呢(注:连接正常的WIFI后数据链接是会自动断开的),在这里就需要先普及一个Android的网络评分机制了,Android会默认给各种网络状态一个初始化默认的分数,当有更高分数的网络就绪时,就将当前分值低的连接断开。而当当前网络被断开时,就寻找当前就绪的其他网络连接,选取分值高的进行接入。并且,每一个网络接入时,都会进行有效性检测,如果检测不通过,将会被扣掉一定分数,此时该网络的优先级也会相应的下降。

因为默认的分数wifi是高于数据连接的,所以当我们接入正常的wifi时,数据链接会自动断开,而关闭wifi时,网络又会自动切回到数据链接,但是,重点来了,是当我们接入正常wifi时,请注意上面红色部分,接入非正常wifi时由于系统去检测wifi状态时(源码中为ping一个指定的网站,看是否能ping通)返回了fail时wifi有效性检测不通过,故数据链接被切换回了数据流量,但是wifi仍处于链接状态,故,给用户造成了以为是在使用wifi的假象。

解决方案:主要思路是修改源码里面的评分机制的有效性检测,若连接了不可使用的wifi网络后,进行有效性检测时,不允许扣掉分数,那么网络通道就会一直处于wifi状态,而用户若是连接需要认证的wifi去上网时就会去到需要认证的界面,而若用户接入了不可使用的wifi,则用户无法上网,则可以手动关闭wifi功能而自行决定是否使用数据流量上网,请看修改后的源码:(注:类在源码中的地址为:frameworks/base/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java)

未修改前(省略部分源码):

private static final int UNVALIDATED_SCORE_PENALTY = 40;private int getCurrentScore(boolean pretendValidated) {......int score = currentScore;if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty()) {score -= UNVALIDATED_SCORE_PENALTY;}if (score < 0) score = 0;return score;
}

UNVALIDATED_SCORE_PENALTY:就是检测不通过扣掉的分数

getCurrentScore:该方法返回当前网络的分数

请看修改后的代码:

private static final int UNVALIDATED_SCORE_PENALTY = 40;private int getCurrentScore(boolean pretendValidated) {......int score = currentScore;if (!lastValidated && !pretendValidated && !ignoreWifiUnvalidationPenalty()) {if("自定义条件,可用宏控制是否使用"){score -= UNVALIDATED_SCORE_PENALTY;}}if (score < 0) score = 0;return score;
}

在这里,我们跳过了减分的语句,即保证,用户连接WIFI后即可关闭数据流量的连接,而断开WiFi后数据通道自动落回到数据流量,当然也可以修改UNVALIDATED_SCORE_PENALTY的值,但是个人不推荐这样改。

好了,到此结束,关于Android评分机制的详细流程大家可以去看源码里的 NetworkFactory、NetworkAgent 、NetworkMonitor和这些类相关的类。
————————————————
版权声明:本文为CSDN博主「Felix1120」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/XCF95319605/article/details/81258834

转载分享:Android8.0 连接需要认证的WIFI或不可用的WIFI后自动断开数据流量连接的实现相关推荐

  1. APP技巧:手机连接WiFi后,移动数据流量要不要关闭,看完你就懂了!

    在移动互联网普及的今天,大家想上网是非常容易的一件事情.打开手机数据流量一秒钟就能连接上互联网,享受网络带来的乐趣.不论是刷视频看电影还是下载需要的文件,统统都能够通过移动数据来搞定. 但是使用移动数 ...

  2. adb connect 远程adb连接手机无法连接,显示由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。(10060)windows调试Linux解决方式 ip连接方式

    adb connect 远程adb连接手机无法连接,显示由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败.(10060) 解决方法 解决步骤 解决方法 解决目标前提 1.需要手机r ...

  3. SecureCRT使用SSH连接linux超时后自动断开

    今天开发的同事,和我说 SecureCRT连接到IDC服务器,老超时断开,影响工作了 研究了下. 因为客户端与服务器之间存在路由器,防火墙以及为了本身的安全性,在超过特定的时间后就会把空闲连接断开.或 ...

  4. netty客户端连接后无限发送数据,连接不上时无限重试,断线重连

    在之前的netty文章里,刚开始学,利用netty实现websocket写了一个聊天程序. 纯netty实现http,websocket协议,头像上传,搭建实时聊天室,群聊,私聊,文字,图片消息 本文 ...

  5. android 蓝牙串口自动断开,uni-app 蓝牙连接被自动断开问题

    遍历 快速对两个蓝牙设备(deviceId,mac地址不同)进行连接操作,时间隔为1秒,蓝牙刚进行连接,监听蓝牙连接状态,直接监听到被自动断开,而且断开两次,有知道怎么回事的不?ios ,androi ...

  6. 笔记本电脑连接蓝牙耳机自动断开,或者显示已配对但过几秒自动断开,蓝牙耳机连接不上笔记本电脑

    在使用笔记本时经常连接蓝牙耳机的时候显示了已配对,但耳机没有声音,然后过几秒就自动断开连接了.这时重启电脑才能重新连接语音和音乐,但是每次重启难受的一批. 重启也就是启动蓝牙模块,我们可以做如下步骤实 ...

  7. 解决navicat 连接数据库隔段时间后自动断开连接问题

    这是因为数据库服务器设置了连接多久没有活动就自动断开,避免连接数过多. 解决办法: 1.选择一个数据库,右键打开连接属性 选择高级,设置Keepalive Interval(240) -- 每4分钟自 ...

  8. 手机连接小爱音箱15分钟后自动断开的解决办法

    问题描述: 蓝牙设备连接小爱触屏音箱15分钟后会自动断开连接. 解决办法: 小爱没有被蓝牙设备连接时,15分钟后会关闭蓝牙,不过用手机还是可以连接上的.下次用蓝牙连接小爱同学前,先把小爱同学的蓝牙开关 ...

  9. 计算机断开网络连接网络设置,win7系统网络总是自动断开网络无法连接怎么解决...

    随缘小编用的win7系统,在上网的过程中,网络常常自动断开,带来了很大的困扰.该如何解决这个问题呢?有时候win7在休眠的时候网络会自动断开,在登录系统的之后网络就无法连接上.这样的win7网络真是让 ...

最新文章

  1. 再见Python!Yann LeCun警告:深度学习需要新编程语言
  2. interceptor拦截器典型应用实例----数据稽核
  3. sql Server snapshots
  4. ITK:创建拉普拉斯内核
  5. 磨刀不误砍柴工—Exceptionless搭配log4net记录日志
  6. GIS实战应用案例100篇(二十一)-全国分省、市、县净初级生产力NPP数据制作实战(附代码)
  7. 2021年360奢侈品用户观察报告
  8. 2016-03-12 Leanning Plan
  9. H3C IGP与EGP
  10. 正确的座机号码格式_电话号码格式怎么输入才是正确
  11. c语言时间换算结构体9,C语言实现时区转换函数的实例
  12. ubuntu16.04,exFAT格式U盘无法打开,离线解决方式
  13. html语言星号,DIV+CSS 星号*
  14. 最高奖励68万!多邻国英语测试设立研究基金
  15. 最强大的Mac软件卸载清理工具 App Cleaner Uninstaller Pro 7.8 Mac版(内附安装包链接)
  16. Jenkins 打包项目出错汇总(持续)
  17. 学习Python可以做什么工作?选哪些工作方向?
  18. solr入门之拼音加汉字方式的搜索建议自动补全的不高效实现
  19. 美国又搞事,芯片工程师们怒了
  20. 剑侠三最新的服务器,《剑网三》新资讯:为何其它三个服务器拒绝与四合一合服?...

热门文章

  1. 带你了解一下什么是SaaS平台
  2. android markdown 笔记,安卓-纯纯写作 | 快速笔记 Markdown
  3. [Java 内存]Java内存组成
  4. 电脑黑屏怎么办?实用解决方法!
  5. 适合理工直男的钟平老师逻辑英语学习笔记
  6. .Bear勒索病毒如何删除它 .Bear后缀文件如何恢复(Dharma家族)
  7. python计算运动会某个参赛选手的得分。数据保存在文件中_为什么一定要考计算机二级证书?8个好处,考和没考区别有点大...
  8. Windows CMD 访问UCN路径
  9. 【vscode】vscode常用插件介绍
  10. 什么牌子的蓝牙耳机音质好?适合听歌的高音质蓝牙耳机推荐