上一篇
安卓判断网络是否连接
- 行业动态
- 2025-04-24
- 3807
Android中可通过ConnectivityManager获取NetworkInfo对象,调用其isConnected()方法判断当前网络是否已
判断网络连接状态的方法
使用 ConnectivityManager
检测网络状态
- 核心类:
ConnectivityManager
(系统服务) - 关键方法:
getActiveNetworkInfo()
(已弃用,但仍兼容低版本)或getNetworkCapabilities()
(API 23+) - 权限:
ACCESS_NETWORK_STATE
(无需动态申请)
判断网络是否可用
// 获取 ConnectivityManager ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 方法1:通过 getActiveNetworkInfo(适用于 API < 23) NetworkInfo networkInfo = cm.getActiveNetworkInfo(); boolean isConnected = networkInfo != null && networkInfo.isConnected(); // 方法2:通过 getNetworkCapabilities(适用于 API >= 23) NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); boolean isConnected = capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET);
判断网络类型(Wifi/移动数据/其他)
网络类型 | 判断条件(旧方法) | 判断条件(新方法) |
---|---|---|
Wifi | networkInfo.getType() == ConnectivityManager.TYPE_WIFI | capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) |
移动数据 | networkInfo.getType() == ConnectivityManager.TYPE_MOBILE | capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) |
有线网络 | 无直接判断(需自定义) | capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) |
无网络 | networkInfo == null || !networkInfo.isConnected() | capabilities == null |
动态权限处理(仅针对网络状态检测)
- 权限声明:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
- 注意:此权限为普通权限,无需动态申请(与
ACCESS_FINE_LOCATION
不同)。
代码示例(兼容不同 API 版本)
public boolean isNetworkAvailable(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (cm == null) return false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // API 23+ NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); return capabilities != null && (capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) || capabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)); } else { // API < 23 NetworkInfo networkInfo = cm.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isConnected(); } }
相关问题与解答
问题1:如何判断当前是否仅连接 Wifi(排除移动数据)?
解答:
在旧方法中,检查 networkInfo.getType() == ConnectivityManager.TYPE_WIFI
;
在新方法中,检查 capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)
且其他传输类型(如蜂窝网络)不存在。
示例代码:
boolean isWifi = false; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { NetworkCapabilities capabilities = cm.getNetworkCapabilities(cm.getActiveNetwork()); isWifi = capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) && !capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); } else { NetworkInfo networkInfo = cm.getActiveNetworkInfo(); isWifi = networkInfo != null && networkInfo.getType() == ConnectivityManager.TYPE_WIFI; }
问题2:如何监听网络状态变化?
解答:
通过注册 BroadcastReceiver
监听 android.net.conn.CONNECTIVITY_CHANGE
广播。
示例代码:
// 定义 BroadcastReceiver private BroadcastReceiver networkReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { boolean isConnected = isNetworkAvailable(context); // 复用上述方法 // 根据状态更新 UI 或逻辑 } }; // 注册与注销(建议在 Activity 或 Service 中操作) @Override protected void onStart() { super.onStart(); IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(networkReceiver, filter); } @Override protected void onStop() { super.onStop(); unregisterReceiver(networkReceiver); }