想要获取网络状态,首先必须在manifest文件下声明权限:
android.permission.INTERNET——允许应用程序打开网络套接字。
android.permission.ACCESS_NETWORK_STATE——允许应用程序访问网络连接信息。
第一种方法可以获取是 移动网络还是WiFi:
在执行网络操作之前,检查设备当前连接的网络连接信息是个好习惯。这样可以防止我们的程序在无意间连接使用了非意向的网络频道。如果网络连接不可用,那么我们的应用应该优雅地做出响应。为了检测网络连接,我们需要使用到下面两个类:
- ConnectivityManager:它会回答关于网络连接的查询结果,并在网络连接改变时通知应用程序。
- NetworkInfo:描述一个给定类型(就本节而言是移动网络或 Wi-Fi)的网络接口状态。
这段代码检查了 Wi-Fi 与移动网络的网络连接。它检查了这些网络接口是否可用(也就是说网络是通的)及是否已连接(也就是说网络连接存在,并且可以建立 socket 来传输数据):
private static final String DEBUG_TAG = "NetworkStatusExample"; ... ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI); boolean isWifiConn = networkInfo.isConnected(); networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); boolean isMobileConn = networkInfo.isConnected(); Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn); Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);
请注意我们不应该仅仅靠网络是否可用来做出决策。由于 isConnected() 能够处理片状移动网络(flaky mobile networks),飞行模式和受限制的后台数据等情况,所以我们应该总是在执行网络操作前检查 isConnected()。
第二个方法:
一个更简洁的检查网络是否可用的示例如下。getActiveNetworkInfo() 方法返回一个 NetworkInfo 实例,它表示可以找到的第一个已连接的网络接口,如果返回 null,则表示没有已连接的网络接口(意味着网络连接不可用):
public boolean isOnline() { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); return (networkInfo != null && networkInfo.isConnected()); }