[Android]解决Android 5.X上WIFI和移动网络显示感叹号的问题

2015年10月6日 0 条评论 921 次阅读 0 人点赞

对于刷上了Android 5.X的小伙伴们来说,肯定会遇到一个比较纠结的问题,那就是状态栏和快速设置上WIFI和移动网络的图标会显示一个感叹号,这对强迫症的人来说简直不能忍啊!难道就没什么办法了吗?有的!看过了小狐狸博主的博文后,我终于解决了这个问题,想着大家也会有此困扰,我便转载了过来,详细的说明请看下文转载内容(稍作修改)~

 

  • 转载原文:https://www.noisyfox.cn/45.html
  • 作者:小狐狸

升级了安卓5.0的同学们一定对网络图标上面的那个感叹号感到十分郁闷。安卓5.0引入了一种新的网络评估机制来评估网络状况,当你有网络请求时会自动选择网络连接条件最好的一个网络进行连接。该机制的代码实现如下:

20141216160153

 

简要来说就是,如果该网络是VPN,那么直接使用这个网络进行连接,否则调用 isCaptivePortal() 函数进行网络状况的判定,再根据判定结果决定是否选用此网络。 而罪魁祸首就是这个 isCaptivePortal() 函数,它会访问 clients3.google.com/generate_204 并根据返回结果来判断网络联通状况。正是这个google的网址被墙导致安卓没有办法评估网络,这样就导致了那个蛋碎的感叹号一直存在,以及wifi用着用着突然自动连回数据连接了。

本来我想直接把 isCaptivePortal() 函数给屏蔽掉,让他一直返回成功,但是看了下google的代码,发现这个函数是非常有用处的,为什么呢?这个函数有个非常重要的作用,那就是判断当前网络是否需要登录。

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

20141216161135

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

然而这就导致了如果简单的屏蔽掉这个函数的功能,那么就没有办法自动提示登录了,但是如果不屏蔽掉那么这个网址被墙掉了,因此会有一个难看的感叹号。想来想去我想到了一个曲线救国的办法,那就是我们把这个网址改成国内的网址不就可以了?我们自己搭一个服务器,来产生这个204返回值给它,问题不就迎刃而解了吗?

  • 解决方法一:屏蔽网络检查或替换服务器(无需root,请进入ADB操作)

1.完全屏蔽网络检查功能,最简单快速,但是就没有办法提示wifi登录:

  1. adb shell "settings put global captive_portal_detection_enabled 0"

 

2.用国内的服务器替换掉google的服务器:

  1. adb shell "settings put global captive_portal_server noisyfox.cn"

这个服务器是我自己建的,也就是本站:http://noisyfox.cn/ 我在服务器上写了个简单的204页面,网址是 http://noisyfox.cn/generate_204 只要用这个网址替换掉google的网址,就可以正常访问并检测网络状态了。不过由于本人的服务器速度并不快,所以感叹号还是会显示一小会儿的,不过应该很快就会消失。这种修改方式具有持久性,重启依旧有效,除非刷机或者清除数据。

注:如上文所说,noisyfox.cn是作者自建的服务器,大家可以根据实际情况替换之(有条件自建的,请看后面的内容)。

  • 解决方法二:使用作者的小工具(需要root)

使用作者的叹号杀手工具,设置好服务器并应用,然后开关下飞行模式,就能直接见效了,简单方便!

Screenshot_2015-09-05-21-20-26

 

下载地址:[file]

 

  • 关于如何建立自己的服务器

1. 对于apache服务器,如果你的服务器安装了rewrite模块,那么只需要在网站的.htaccess中加入以下代码:

  1. <IfModule mod_rewrite.c>
  2.   RewriteEngine On
  3.   RewriteCond %{REQUEST_URI} /generate_204$
  4.   RewriteRule $ / [R=204]
  5. </IfModule>

 

2. 对于nginx,直接加入以下设置即可:

  1. location /generate_204 { return 204; }

3. 如果以上方法都无效,那么就要利用代码中的一个小trick来完成,直接在网站的根目录下建立一个叫做“generate_204”的空文件即可,因为安卓的源码中写了如果返回的内容为空那么也会当成204(毕竟一个空的页面怎么想都不可能是登录页面嘛!)。

  • 一些提供服务的网址,大家可以挑选并替换:
  1. 原博主:noisyfox.cn
  2. 小米:connect.rom.miui.com
  3. 热心网友的个人站点(by Zohar:):www.iwch.me
  4. 架设于LeanCloud服务器,据lkebin称是永久有效(by lkebin):liukebin.avosapps.com
  5. 小众软件:5.0.appinn.com

 

最后如果你搞定了,就能看到如下的效果了(感叹号已不见~):

1

 

壁纸:ゆきのん(P站ID:48216364,画师:こうましろ@金曜日東0A41b)

相似文章

12点半

Darkness cannot drive out darkness; only light can do that. Hate cannot drive out hate; only love can do that.

文章评论(0)