Xamarin Forms(Android)中检测移动网络是否已开启的最佳实现方式是什么?
Android设备移动数据网络开启状态检测实现方案
前置权限配置
首先需要在AndroidManifest.xml中声明网络状态访问权限,该权限为普通权限,无需动态申请:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
分版本实现逻辑
由于Android不同API版本对移动数据开关的访问API做了隐藏/公开调整,需要做版本适配:
API 29(Android 10)及以上版本
系统直接公开了isMobileDataEnabled()方法,可直接调用:val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val isMobileDataEnabled = connectivityManager.isMobileDataEnabledAPI 23 ~ API 28(Android 6.0 ~ Android 9)
对应方法被系统隐藏,需要通过反射调用:val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager var isMobileDataEnabled = false try { val method = ConnectivityManager::class.java.getDeclaredMethod("isMobileDataEnabled") isMobileDataEnabled = method.invoke(connectivityManager) as Boolean } catch (e: Exception) { // 反射调用失败可自行补充兜底逻辑 }API 22及以下版本
反射调用getMobileDataEnabled隐藏方法即可:val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager var isMobileDataEnabled = false try { val method = ConnectivityManager::class.java.getDeclaredMethod("getMobileDataEnabled") isMobileDataEnabled = method.invoke(connectivityManager) as Boolean } catch (e: Exception) { // 异常兜底处理 }
实用注意事项
- 上述方法仅检测移动数据开关是否处于开启状态,不代表当前设备有可用的移动数据网络:开关开启后仍可能因为无信号、SIM卡异常、欠费等原因无法联网,需要判断实际连通性时请使用
NetworkCallback监听网络状态变更。 - 反射调用可能被部分定制ROM拦截,建议做好异常捕获,避免出现崩溃。
- 不要在主线程频繁执行反射操作,避免造成界面卡顿。
- 如果仅需要判断当前设备的活跃网络是否为移动数据,不需要区分开关状态,可以直接用以下适配全版本的代码:
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val activeNetwork = connectivityManager.activeNetwork val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) val isUsingMobileData = networkCapabilities?.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) == true
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

