如何消除原生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_enabled 0

但是,这样的做法明显有问题:当碰到需要登录的网络也无法判断出来,从而无法提示用户进行web登录了。

因此,最好的做法是提供一个可以访问的网站来专门返回204状态码,然后将检测服务器定向到该地址。

这里,我为大家提供一个网络检测服务器地址:

http://www.androidbak.net/generate_204

利用如下的adb命令就可以修改该服务器地址了:

$ adb shell settings put global captive_portal_server www.androidbak.net

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

$ adb shell settings delete global captive_portal_server
$ adb shell settings put global captive_portal_detection_enabled 1
时间: 2024-11-04 22:47:30

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

判断Android网络状态信息-wifi,3g/4g 和定位方式-gps,network,passive

我们项目的工具类中,这些方法应该是常驻方法,因为他们太常用了,一方面将这些方法总结在这篇文章中,以便于自己日后使用,另一方面也给大家提供个方便,省的每次到处去找了. 1.判断当前是否已经连网 不管连接的是WIFI还是移动网络,最终都会返回true,否则返回false public static boolean isNetworkAvailable(Context context){ if (context!=null) { //获取系统服务 ConnectivityManager cm = (C

Android网络状态判断 wifi mobile

/** * 网络状态 wifi mobile * * @author jiangbing * */ public class NetworkUtils { /** * 判断当前是否 网络连接 (是否有效的连接)不分wifi mobile */ public static boolean isConnectdeAvailable(Context context) { try { ConnectivityManager manager = (ConnectivityManager) context

Android网络状态获取和WebView的加载完成,加载失败监听

在我们的项目中,经常需要对WebView中加载的内容是否完成或者是否加载失败进行判别,这两天写的一个小应用就涉及到了这一点. WebView的实质就是loadUrl,所以前提是设备接入网络,那么这个如何判断呢?看代码吧: // 网络状态 public boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (Connectivit

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

之前一直在做SiteCheck的项目,所用到的知识大部分都涉及到网络编程方面,所以现在有时间先把它的使用方法及一些注意事项记录下来.在这里我用两种例子让大家了解它的使用方法: (1)上传图片及相应参数到服务器  (2)上传语音及相应参数到服务器.代码比较多.... 先贴上代码,再解析: UploadFileTask .java : (实现异步上传的执行类) <span style="font-size:14px;">public class UploadFileTask e

android 网络文件上传下载工具类总结

1.获取文件的最后修改时间 @SuppressLint("SimpleDateFormat") public String getFileDataTime(File file) { Date date = new Date(file.lastModified()); SimpleDateFormat sdformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 24小时制 String LgTime = sdfo

Android 网络状态检测

package com.example.administrator.yunstore.net; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Connectivi

Android 网络状态操作

/** * 声明连接管理器对象 */ private ConnectivityManager connectivityManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //1.通过系统服务得到连接管理器对象 this.connectivityManage

android 监听网络状态的变化及实战

android 监听网络状态的变化及实际应用 转载请注明博客地址:http://blog.csdn.net/gdutxiaoxu/article/details/53008266 平时我们在请求错误的情况下,通常会进行处理一下,一般来说,主要分为两方面的错误 - 没有网络的错误 - 在有网络的情况下,我们客户端的错误或者服务器端的错误 今天这篇博客主要阐述以下问题 怎样监听网络状态的变化,包括是否打开WiFi,否打开数据网络,当前连接的网络是否可用 网络没有打开情况下的处理,如弹出对话框,跳转到

Android笔记之网络状态

先上一个工具类的代码: package com.yonyou.util; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; /** * 判断当前网络状态 * @author xxx * */ public class NetWorkUtil { static NetWorkUtil netWorkUtil; private NetWorkU