今天,简单讲讲android里如何解决getNetworkInfo过时的问题。
之前,我写了一篇博客,讲如何获取手机是否连网,其中有的代码用到了ConnectivityManager 的getNetworkInfo函数,但是最近检查代码时,发现getNetworkInfo已经过时,所以在网上查找了资料,发现关于这个的不多。但是还是有替代的函数判断手机是否联网。这里记录一下。
描述了当前网络 Mobile和Wifi的状态。
有2个内部类 NetworkInfo.DetailedState(精确的网络状态)和 NetworInfo.State(粗略的网路状态)
Detailed state |
Coarse-grained state |
IDLE |
DISCONNECTED |
SCANNING |
CONNECTING |
CONNECTING |
CONNECTING |
AUTHENTICATING |
CONNECTING |
CONNECTED |
|
DISCONNECTING |
DISCONNECTING |
DISCONNECTED |
DISCONNECTED |
UNAVAILABLE |
DISCONNECTED |
FAILED |
DISCONNECTED |
里面几个常用函数
isAvailable() isConnected() getDetailedState() getState() getExtrInfo()
getType() 获取当前网络的类型mobile or Wi-Fi
getTypeName() 获取当前网络的类型名 “WIFI” or “MOBILE”
ConnectivityManager
用于查询网络连接状态,当网络状态发生改变时通知应用。通过调用Context.getSystemService(Context.CONNECTIVITY_SERVICE)。主要功能:
1. 监视网络(Wi-Fi,GPRS,UMTS,etc)的连接
2. 网络状态发生改变时发送广播
3. 网络丢失时尝试转移的别的网络
4. 提供API
主要函数介绍
1. NetworkInfo getActiveNetworkInfo() 获取可用网络(可用)
2. NetworkInfo[] getAllNetworkInfo 获取所有可用网络(已经过时)
3. NetworkInfo getNetworkInfo(int networkType) 获取固定网络信息 (已经过时)
4. isNetworkTypeValid(int networkType)
Android判断当前网络状态是否连接函数
Public static Boolean isNetworkConnected(Context context) { ConnectivityManager manager = (ConnectivityManager) context .getApplicationContext().getSystemService( Context.CONNECTIVITY_SERVICE); if (manager == null) { return false; } NetworkInfo networkinfo = manager.getActiveNetworkInfo(); if (networkinfo == null || !networkinfo.isAvailable()) { return false; } return true; }
或者这样也可以
/** * 网络是否可用 * * @param activity * @return */ public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity == null) { } else { NetworkInfo[] info = connectivity.getAllNetworkInfo(); if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } } return false; }
更加严谨的写法:
public static boolean checkNet(Context context) { try { ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (connectivity != null) { NetworkInfo info = connectivity.getActiveNetworkInfo(); if (info != null && info.isConnected()) { if (info.getState() == NetworkInfo.State.CONNECTED) { return true; } } } } catch (Exception e) { return false; } return false; }
简单讲讲,其实就是使用了ctiveNetworkInfo()替代了已经过时的getNetworkInfo(int networkType) ,这样就可以判断手机网络是否连接。如果判断网络类型,那怎么办呢?
/** * 判断当前网络是否是wifi网络 * if(activeNetInfo.getType()==ConnectivityManager.TYPE_MOBILE) { //判断3G网 * * @param context * @return boolean */ public static boolean isWifi(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { return true; } return false; }
/** * 判断当前网络是否是3G网络 * * @param context * @return boolean */ public static boolean is3G(Context context) { ConnectivityManager connectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); if (activeNetInfo != null && activeNetInfo.getType() == ConnectivityManager.TYPE_MOBILE) { return true; } return false; } }
android 解决getNetworkInfo过时就讲完了。
就这么简单。