前言: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)
未修改前(省略部分源码):
if("自定义条件,可用宏控制是否使用"){
在这里我们跳过了减分的语句,即保证用户連接WIFI后即可关闭数据流量的连接,而断开WiFi后数据通道自动落回到数据流量当然也可以修改UNVALIDATED_SCORE_PENALTY的值,但是个人不推荐这样改