上一篇
安卓开发怎么确定数据连接可用
- 行业动态
- 2025-04-22
- 8
确定安卓设备数据连接可用的方法
在安卓开发中,判断设备的数据连接(如移动网络 4G/5G)是否可用,通常需要结合系统提供的网络状态 API 和权限管理,以下是详细实现步骤和注意事项:
检查网络状态权限
在 AndroidManifest.xml
中声明权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
此权限为普通权限,无需动态申请。
通过 ConnectivityManager 获取网络信息
核心逻辑是通过 ConnectivityManager
获取当前网络状态,并判断是否为移动数据连接。
步骤说明
获取 ConnectivityManager 实例
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
检查网络是否可用(兼容不同 API 版本)
- API < 23:使用
getActiveNetworkInfo()
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); boolean isAvailable = (activeNetwork != null) && activeNetwork.isConnected();
- API ≥ 23:使用
getNetworkCapabilities()
Network network = cm.getActiveNetwork(); NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); boolean isAvailable = (capabilities != null) && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
- API < 23:使用
判断是否为移动数据连接
- API < 23:通过
NetworkInfo.getType()
boolean isMobile = activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE;
- API ≥ 23:通过
NetworkCapabilities.hasTransport()
boolean isMobile = capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR);
- API < 23:通过
完整示例代码
public boolean isDataConnectionAvailable(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+ Network network = cm.getActiveNetwork(); if (network == null) return false; NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); return capabilities != null && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR); } else { // API < 23 NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.isConnected() && activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE; } }
注意事项
问题 | 解决方案 |
---|---|
权限未声明 | 确保在 AndroidManifest.xml 中添加 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> |
设备无 SIM 卡或飞行模式 | 需额外判断 TelephonyManager.getSimState() 或监听网络状态变化(如注册 NetworkCallback ) |
网络类型误判 | 使用 NetworkCapabilities.hasTransport() 替代已弃用的 NetworkInfo.getSubtype() |
相关问题与解答
问题1:如何检查设备是否连接到 WiFi?
解答:
通过 ConnectivityManager
判断当前网络类型是否为 WIFI
:
boolean isWiFiConnected() { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { Network network = cm.getActiveNetwork(); NetworkCapabilities capabilities = cm.getNetworkCapabilities(network); return capabilities != null && capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI); } else { NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); return activeNetwork != null && activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; } }
问题2:如何监听网络连接状态变化?
解答:
注册 NetworkCallback
监听网络变化(适用于 API ≥ 21):
public void registerNetworkCallback(Context context) { ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest request = new NetworkRequest.Builder().build(); cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { super.onAvailable(network); // 网络可用时回调 } @Override public void onLost(Network network) { super.onLost(network); // 网络断开时回调 } }); }