如何消除原生Android网络状态上的惊叹号
喜欢使用原生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网络状态上的惊叹号的更多相关文章
- 关于 Android 5.0 原生系统网络图标上的感叹号问题解决方法
解决方案 adb shell settings put global captive_portal_server g.cn 参考 关于 android 5.0 网络图标上的感叹号及其解决办法
- Android网络状态监控
Android 监控网络状态 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化.android的网络状态监听可以用BroadcastReceiver来接 ...
- SSM + Android 网络文件上传下载
SSM + Android 网络交互的那些事 2016年12月14日 17:58:36 ssm做为后台与android交互,相信只要是了解过的人都知道一些基本的数据交互,向json,对象,map的交互 ...
- Android 网络编程--上传文件及相应的参数到服务器
之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数 ...
- Android 网络状态检测
package com.example.administrator.yunstore.net; import android.app.AlertDialog; import android.conte ...
- android 网络状态判断【转】
import java.net.InetAddress; import android.app.Activity;import android.content.Context;import andro ...
- Android 网络状态的监控
1 http://www.cnblogs.com/qingblog/archive/2012/07/19/2598983.html 2
- Android实时监听网络状态
Android实时监听网络状态(1) 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...
- Android开发——监听Android手机的网络状态
0. 前言 在Android开发中监听手机的网络状态是一个常见的功能,比如在没网的状态下进行提醒并引导用户打开网络设置,或者在非wifi状态下开启无图模式等等.因此本篇将网上的资料进行了整理总结,方便 ...
随机推荐
- zookeeper的原理,5分钟了解zookeeper
一 .Zookeeper功能简介 ZooKeeper 是一个开源的分布式协调服务,由雅虎创建,是 Google Chubby 的开源实现.分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/ ...
- P3372 【模板】线段树 1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(视频总揽和功能演示)
主要实现的功能 其它视频和资料稍候再补充上 我先写后面的文章 2-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案数据篇(安装数据库,数据库简单说明)
- 九、xadmin菜单分组管理
有的时候,我们的菜单很多很杂,想要把菜单进行分组以方便管理,如下 前一篇博文已经详细讲解了如何菜单自定义排序,自定义分组和排序其实写法类似: 要实现上面这个功能,分为以下几步: 1. 我们需要定义一个 ...
- Python_匿名函数_47
匿名函数 Eva_J 匿名函数:为了解决那些功能很简单的需求而设计的一句话函数 #这段代码 def calc(n): return n**n print(calc(10)) #换成匿名函数 calc ...
- hibernate在写cfg配置文件自动创建表时报错org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
在用hibernate框架时,写cfg文件,想自动生成表时,一般写<property name="hibernate.hbm2ddl.auto">create</ ...
- iOS保持App真后台运行
https://www.jianshu.com/p/d466f2da0d33 在我看来,苹果系统与安卓系统最直观的区别就是后台处理方式了吧,安卓手机一旦开启了很多app放到后台,即使前台什么也不做,就 ...
- iOS上手指点击波纹效果的实现
https://www.jianshu.com/p/35e6f53ca0fe 2016.10.19 22:00* 字数 135 阅读 2468评论 2喜欢 7 闲暇时间做了一个反馈手指点击屏幕的效果, ...
- Tomcat集成Memcached Session Manager方案
http://repo1.maven.org/maven2/de/javakaffee/msm/memcached-session-manager/2.3.2/memcached-session-ma ...
- # 【Python3练习题 008】判断101-200之间有多少个素数,并输出所有素数。
lst = []for i in range(100): #建立 101-200 的列表 lst.append(101+i) for i in range(101, 201): #除数为 101-20 ...