Android 7.1.2 平台
连接WiFi后,显示connect,no Internet,同时伴有notifaction的通知。
产生现象原因:
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
frameworks/base/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
先看NetworkMonitor.java
// Default configuration values for captive portal detection probes.
// TODO: append a random length parameter to the default HTTPS url.
// TODO: randomize browser version ids in the default User-Agent String.
private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204";
//private static final String DEFAULT_HTTP_URL =
//"http://connectivitycheck.gstatic.com/generate_204";
private static final String DEFAULT_HTTP_URL =
" http://www.noisyfox.cn/generate_204"
private static final String DEFAULT_FALLBACK_URL = "http://www.google.com/gen_204";
private static final String DEFAULT_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) "
+ "AppleWebKit/537.36 (KHTML, like Gecko) "
+ "Chrome/52.0.2743.82 Safari/537.36";
可以看到我标红处有两个网络URL,这两个都是用来测试网络是否通的测试地址。
wifi连接成功后会进行验证,如果是要登录需要验证的WiFi,则会弹出验证页面,如果不是,则会登录google服务器请求204验证码,如果返回204则表示网络可以正常连接,此时WiFi图标x会消失并且WiFi显示Connected。由于国内无法访问Google网站,所以默认会存在此问题。
依据网上的一些经验,修改这个url就行了,如下:
选自:https://blog.csdn.net/a567890k/article/details/75103419
将frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java 的DEFAULT_HTTPS_URL 改成 https://www.noisyfox.cn/generate_204
DEFAULT_HTTP_URL 改成 http://www.noisyfox.cn/generate_204
由于这个服务器速度不快,所以X号等提示语要过段时间才消失。要精于求精的话可以找别的服务器,自己搭一个也行
这样的解决方式可行,但在我的这个现状来说有点问题,就是我所在的这个平台将下拉状态栏已经禁用掉了,当弹出notifaction的时候,如果用户点到这个notify,那么系统将会出现异常,很卡,需要重启才能正常。
这时候,采取了另一种方式就是在该notification 创建的之前将其拦截,不让它进行显示(这里还有另一种思路,可以在检测时候需要发送广播创建notification的时候,拦截,不让系统进行广播,这个没有进行验证),
解决如下:在NetworkNotificationManager.java中:
经过这样的过滤后,如果当前系统下拉栏是处于禁止状态,这里也就不会进行notify了。最终验证通过!
ps:
另外,这里在提下网络连接谷歌验证处理的其他方法,
我们上面提到的是修改验证的url,还有另外一种方式就是我们直接禁止网络连接后进行网络连接验证。
可以回到源码处,查看一个测试验证开关如下;
这里直接将这个bool变量置位false,后果如何呢?可以跟踪下,该变量使用的地方,
这里跟上面提到的验证成功,谷歌服务器会返回一个204的码,当该变量置位false,进入if执行段,这里也就直接相当于强制验证成功了。这样做又有另一个bug,就是当连接到真正没有网络连接的WiFi时,显示的还是有网络连接,怎么修改,看大家自己选择吧,顺带提一下,笔者最终采用了在notification创建之前进行拦截,上面提到的是在网络no Internet的时候拦截,后面发现需要登录的网络也会出现上面的现象,最好干脆拦截所有的NotificationType action,可见后面的图。(那么,判断网络是否通的最终是看测试地址是否返回一个204的码,因此这里也反向说明随便找一个国内可访问的地址作为测试地址是不可取的,笔者曾走过这条弯路)。