Android应用中如何检查蜂窝数据是否启用(规避废弃API)
检查蜂窝数据状态的无废弃API实现
你的代码中ActiveNetworkInfo在API 23(Android 6.0)已被废弃,且针对高版本设备的实现存在局限性。以下是分版本适配的无废弃实现,同时区分两种常见需求:
一、检查当前是否通过蜂窝网络连接
private bool IsConnectedToCellular(Context context) { var connectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService); if (connectivityManager == null) return false; if (Build.VERSION.SdkInt >= BuildVersionCodes.M) { var network = connectivityManager.ActiveNetwork; if (network == null) return false; var networkCapabilities = connectivityManager.GetNetworkCapabilities(network); return networkCapabilities != null && networkCapabilities.HasTransport(Android.Net.TransportType.Cellular); } else { // API <23 用非废弃接口遍历所有网络 var allNetworks = connectivityManager.AllNetworks; foreach (var network in allNetworks) { var networkInfo = connectivityManager.GetNetworkInfo(network); if (networkInfo != null && networkInfo.IsConnected && networkInfo.Type == ConnectivityType.Mobile) return true; } return false; } }
说明:API <23时,用AllNetworks配合GetNetworkInfo(Network)替代废弃的ActiveNetworkInfo,遍历所有网络确认是否有活跃的蜂窝连接。
二、检查系统蜂窝数据开关是否启用(非当前连接状态)
如果你的需求是确认系统设置里的蜂窝数据开关是否打开,而非当前是否连接,可使用以下实现:
private bool IsCellularDataEnabled(Context context) { var telephonyManager = (TelephonyManager)context.GetSystemService(Context.TelephonyService); if (telephonyManager == null) return false; if (Build.VERSION.SdkInt >= BuildVersionCodes.R) { // API 30+ 使用官方推荐的IsDataEnabled return telephonyManager.IsDataEnabled; } else if (Build.VERSION.SdkInt >= BuildVersionCodes.O) { // API 26-29 用DataEnabled(低版本无替代接口,可安全兼容) return telephonyManager.DataEnabled; } else { // API <26 读取系统设置值 try { return Settings.System.GetInt(context.ContentResolver, Settings.System.MobileData) == 1; } catch (Settings.SettingNotFoundException) { return false; } } }
权限要求
需在AndroidManifest.xml中添加对应权限:
<!-- 检查网络连接状态所需 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 检查蜂窝数据开关(API<26)所需 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
Android 10+(API29+)中,READ_PHONE_STATE属于危险权限,需动态申请。
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

