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

Android 9中ConnectivityManager获取WiFi连接状态异常问题

正确判断WiFi连接状态的BroadcastReceiver实现

原代码问题分析

你的代码存在两个核心问题:

  1. 判断逻辑偏差:hasTransport(NetworkCapabilities.TRANSPORT_WIFI)仅能判断设备的WiFi模块是否激活(即WiFi开关是否打开),而非是否已连接到有效WiFi热点。因此WiFi开启但未连接热点时会错误返回true。
  2. activeNetwork的局限性:connectivityManager.activeNetwork获取的是当前系统正在使用的活跃网络,若此时活跃网络是移动数据,即便WiFi已连接,也会错误返回false。

正确实现方案

方案1:直接从广播Intent获取WiFi状态(推荐)

WifiManager.NETWORK_STATE_CHANGED_ACTION广播会直接携带当前WiFi的连接状态,无需额外查询ConnectivityManager,结果更准确:

class WifiStateReceiver : BroadcastReceiver() {
    override fun onReceive(ctx: Context, intent: Intent) {
        if (intent.action == WifiManager.NETWORK_STATE_CHANGED_ACTION) {
            // 从广播Intent中提取WiFi网络状态
            val networkInfo = intent.getParcelableExtra<NetworkInfo>(WifiManager.EXTRA_NETWORK_INFO)
            val isWifiConnected = networkInfo?.isConnected == true
            Log.i("TEST", "Wifi Connection: $isWifiConnected")
        }
    }
}

方案2:修正ConnectivityManager判断逻辑

如果需要通过ConnectivityManager判断,需遍历所有网络,检查是否存在已连接且可用的WiFi网络:

class WifiStateReceiver : BroadcastReceiver() {
    override fun onReceive(ctx: Context, intent: Intent) {
        if (intent.action == WifiManager.NETWORK_STATE_CHANGED_ACTION) {
            Log.i("TEST", "Wifi Connection: ${isWifiConnected(ctx)}")
        }
    }

    private fun isWifiConnected(context: Context): Boolean {
        val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 遍历所有网络,查找已验证的WiFi连接
            connectivityManager.allNetworks.any { network ->
                val capabilities = connectivityManager.getNetworkCapabilities(network)
                capabilities != null &&
                        capabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) &&
                        capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
            }
        } else {
            // 低版本直接获取WiFi类型的网络状态
            val wifiNetworkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
            wifiNetworkInfo?.isConnected == true
        }
    }
}

关键注意事项

  1. 权限配置:在AndroidManifest.xml中添加必要权限:
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    
  2. 广播注册方式:Android 8.0(API 26)及以上版本,静态注册WifiManager.NETWORK_STATE_CHANGED_ACTION会失效,需动态注册:
    // 在Activity/Service中动态注册
    private lateinit var wifiReceiver: WifiStateReceiver
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        wifiReceiver = WifiStateReceiver()
        val intentFilter = IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION)
        registerReceiver(wifiReceiver, intentFilter)
    }
    
    override fun onDestroy() {
        super.onDestroy()
        unregisterReceiver(wifiReceiver)
    }
    

内容的提问来源于stack exchange,提问作者timeislikewind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:58:41