喜欢使用原生Android系统的朋友可能会发现自己的状态栏信号图标上经常有一个惊叹号标志。

这是怎么回事呢?原因是Android为了对网络状态进行检测,采用了一种叫做captive detection的方式进行网络状态检测。

其实说起来很简单,每当连接到一个网络,比如移动数据网络或者WIFI的时候,Android的NetworkMonitor模块会构造一个http的请求,发送到指定的服务器,然后利用收到的响应进行网络状态判断。

网络状态有如下几种状态:
1) 根本就没有返回,这种情况代表当前没有Internet访问;参见图1左图。

2) 返回状态码204,这种情况代表具备完整的Internet访问(特定的服务器专门返回204的状态码);参见图1右图。

3) 除204以外的其他大于200而小于400的状态码,这种状态码一般代表需要进行Web登录的网络连接,比如机场、商场提供的需要短信登陆的网络。这种情况下Android会构造一个可能需要登录的状态栏通知以通知用户可能需要进行登陆。参见图2。

默认的Android系统访问的特定服务器地址是:

http://clients3.google.com/generate_204
非常幸运,感谢伟大的墙,该地址我们在国内根本无法访问,因此总是没有返回值。这种情况下,Android总是认为当前没有Internet访问能力,因此会在信号图标上显示感叹号。
而其实这时候我们是可以访问网络的。为了消除这种误判,我们可以粗暴的将该功能关闭,通过如下的adb命令就可以做到:
[注意:这种方法不推荐,不建议执行这个命令]

$ adb shell settings put global captive_portal_detection_eanbled 0

但是,这样的做法明显有问题:当碰到需要登录的网络也无法判断出来,从而无法提示用户进行web登录了。
因此,最好的做法是提供一个可以访问的网站来专门返回204状态码,然后将检测服务器定向到该地址。
这里,我为大家提供一个我知道的网络检测服务器地址:http://204.gentool.top
利用如下的adb命令就可以修改该服务器地址了:

$ adb shell settings put global captive_portal_server 204.gentool.top

如果大家使用过后觉得不想用了,可以使用如下的命令恢复初始状态:

$ adb shell settings delete global captive_portal_server

更新补充一点:

注意:从Android N(7.0)开始,默认使用https,并且设置项发生改变(从CAPTIVE_PORTAL_SERVER = "captive_portal_server"=>CAPTIVE_PORTAL_HTTP_URL = "captive_portal_http_url")。

$ adb shell settings put global captive_portal_detection_enabled 1
$ adb shell settings put global captive_portal_use_https 1
$ adb shell settings put global captive_portal_https_url https://204.gentool.top

如果觉得麻烦,可以单条命令:

$ adb shell settings put global captive_portal_detection_enabled 1 && adb shell settings put global captive_portal_use_https 1 && adb shell settings put global captive_portal_https_url https://204.gentool.top

如何消除原生Android网络状态上的惊叹号的更多相关文章

  1. 关于 Android 5.0 原生系统网络图标上的感叹号问题解决方法

    解决方案 adb shell settings put global captive_portal_server g.cn 参考 关于 android 5.0 网络图标上的感叹号及其解决办法

  2. Android网络状态监控

    Android 监控网络状态 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化.android的网络状态监听可以用BroadcastReceiver来接 ...

  3. SSM + Android 网络文件上传下载

    SSM + Android 网络交互的那些事 2016年12月14日 17:58:36 ssm做为后台与android交互,相信只要是了解过的人都知道一些基本的数据交互,向json,对象,map的交互 ...

  4. Android 网络编程--上传文件及相应的参数到服务器

    之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...

  5. Android 网络状态检测

    package com.example.administrator.yunstore.net; import android.app.AlertDialog; import android.conte ...

  6. android 网络状态判断【转】

    import java.net.InetAddress; import android.app.Activity;import android.content.Context;import andro ...

  7. Android 网络状态的监控

    1 http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html 2

  8. Android实时监听网络状态

    Android实时监听网络状态(1)   其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...

  9. Android开发——监听Android手机的网络状态

    0. 前言 在Android开发中监听手机的网络状态是一个常见的功能,比如在没网的状态下进行提醒并引导用户打开网络设置,或者在非wifi状态下开启无图模式等等.因此本篇将网上的资料进行了整理总结,方便 ...

随机推荐

  1. 【转】深入理解Java:注解(Annotation)--注解处理器

    https://www.cnblogs.com/peida/archive/2013/04/26/3038503.html 如果没有用来读取注解的方法和工作,那么注解也就不会比注释更有用处了.使用注解 ...

  2. mysql远程连接 Host * is not allowed to connect to this MySQL server

    mysql -u root -p mysql>use mysql; mysql>update user set host =’%'where user =’root’; mysql> ...

  3. Unity编辑器:基于NGUI的引用检测工具

    这里共享一个基于NGUI的引用检测工具.工具包括几个部分:Atlas/Sprite的引用查找:字库引用查找:UITexture引用查找:Component查找: 代码就不多介绍了,文章底部提供源码下载 ...

  4. 【机器学习】SKlearn + XGBoost 预测 Titanic 乘客幸存

    Titanic 数据集是从 kaggle下载的,下载地址:https://www.kaggle.com/c/titanic/data 数据一共又3个文件,分别是:train.csv,test.csv, ...

  5. JVM总括三-字节码、字节码指令、JIT编译执行

    JVM总括三-字节码.字节码指令.JIT编译执行 目录:JVM总括:目录 java文件编译后的class文件,java跨平台的中间层,JVM通过对字节码的解释执行(执行模式,还有JIT编译执行,下面讲 ...

  6. (5)学习笔记 ) ASP.NET CORE微服务 Micro-Service ---- 熔断降级(Polly)

    一. 什么是熔断降级 熔断就是“保险丝”.当出现某些状况时,切断服务,从而防止应用程序不断地尝试执行可能会失败的操作给系统造成“雪崩”,或者大量的超时等待导致系统卡死. 降级的目的是当某个服务提供者发 ...

  7. Python_老男孩练习题1

    get有陷阱:value   5.以下打印的内容是:——————    ——————    —————— [10, 'a'] [123] [10, 'a'] #方法一: 将list 转为 set #l ...

  8. Python-类与对象

    类与对象的概念 类即类别.种类,是面向对象设计最重要的概念,从一小节我们得知对象是特征与技能的结合体,而类则是一系列对象相似的特征与技能的结合体. 那么问题来了,先有的一个个具体存在的对象(比如一个具 ...

  9. sql中return和returns的区别

    用户定义函数中,用RETURNS 子句指定该函数返回值的数据类型 return用于返回具体的值/值变量

  10. python的四种内置数据结构

    对于每种编程语言一般都会规定一些容器来保存某些数据,就像java的集合和数组一样python也同样有这样的结构 而对于python他有四个这样的内置容器来存储数据,他们都是python语言的一部分可以 ...