Android 9中ConnectivityManager获取WiFi连接状态异常问题
正确判断WiFi连接状态的BroadcastReceiver实现
原代码问题分析
你的代码存在两个核心问题:
- 判断逻辑偏差:
hasTransport(NetworkCapabilities.TRANSPORT_WIFI)仅能判断设备的WiFi模块是否激活(即WiFi开关是否打开),而非是否已连接到有效WiFi热点。因此WiFi开启但未连接热点时会错误返回true。 - 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 } } }
关键注意事项
- 权限配置:在AndroidManifest.xml中添加必要权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> - 广播注册方式: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
相关产品推荐
相关产品推荐

