喜欢使用原生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. VMware中安装Centos 7

    1.点击“文件-新建”,如下图 2.选择"典型".下一步 3.选择”稍后安装操作系统”,下一步. 4.选择要安装的操作系统类型,下一步 5.填写虚拟机名称,设置虚拟机的存放位置,下 ...

  2. .net ElasticSearch-Sql 扩展类【原创】

    官方提供的是java sdk,并支持jdbc方式的查询结果输出;但是却没有.net sdk的支持. 开发 ElasticSearch-Sql 第三方开源项目的.net sdk,未来集成入bsf框架.( ...

  3. Codechef SUMCUBE Sum of Cubes 组合、三元环计数

    传送门 好久没有做过图论题了-- 考虑\(k\)次方的组合意义,实际上,要求的所有方案中导出子图边数的\(k\)次方,等价于有顺序地选出其中\(k\)条边,计算它们在哪一些图中出现过,将所有方案计算出 ...

  4. Dijkstra的应用

    每次只涉及一边两端点的极值循环转移应用Dijkstra.

  5. Node.js api接口和SQL数据库关联

    数据库表创建 服务器环境配置.连接 .操作.数据库 API接口  原则:

  6. 使用webview几种常见的hybrid通信方式

    js 与原生之间的通信: 1.JSbridge::(webviewJavascriptBridge)一种js与原生native通信的机制,可以h5与native互调: 2.Cordova: 核心就是原 ...

  7. hdu3790 dijkstra+堆优化

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790 分析:dijkstra没有优化的话,复杂度是n*n,优化后的复杂度是m*logm,n是顶点数,m ...

  8. Windows之系统自带截屏快捷键

    Windows之系统自带截屏快捷键 现在我们都习惯了使用QQ截屏,但是有时候电脑没有网络,也就意味着无法登陆QQ,在这个时候再有截屏的需求时,我们就束手无策了. 截取全屏 现在我说以个Windows系 ...

  9. awr format

    AWR-Format工具 在Chrome高版本中配置使用AWR-Format for Chrome插件

  10. js原生实现div渐入渐出

    jq对渐入渐出进行封装,简单的使用连个方法就可以实现.fadeIn(),fadeOut();如果我们界面没有使用jq那么原生怎么实现呢? 我们讲解一下,这个原理.当我们要实现渐入的时候,首先是让隐藏的 ...