You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.isMobileDataEnabled
    
  • API 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 23:54:01