如何在Android(Kotlin)中获取Wi-Fi网络支持的频段列表
获取Wi-Fi网络频段并切换的实现方案
一、所需权限
首先在AndroidManifest.xml中声明必要权限:
- Android 11及以下:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- 部分设备扫描Wi-Fi需位置权限 --> - Android 12及以上:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" /> <!-- 替代位置权限用于Wi-Fi扫描 -->
注意:必须动态申请上述权限,否则无法获取Wi-Fi扫描结果或连接信息。
二、判断Wi-Fi网络支持的频段
1. 从已连接网络获取当前频段
如果设备已连接目标Wi-Fi,可直接读取当前连接的频率:
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager val wifiInfo = wifiManager.connectionInfo if (wifiInfo.networkId != -1) { val frequency = wifiInfo.frequency val band = when { frequency in 2400..2483 -> "2.4GHz" frequency in 5150..5850 -> "5GHz" else -> "未知频段" } // 这里可根据band做后续逻辑处理 }
2. 从扫描结果判断双频支持
要确认某个SSID是否同时支持2.4G和5G,需扫描周围Wi-Fi并按SSID分组统计频率:
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager // 发起Wi-Fi扫描(注意:Android 10+对后台扫描有严格限制,建议前台操作) wifiManager.startScan() val scanResults = wifiManager.scanResults // 按SSID分组,收集每个SSID的所有频段频率 val ssidFrequencyMap = mutableMapOf<String, MutableSet<Int>>() scanResults.forEach { result -> val ssid = result.SSID.removeSurrounding("\"") // 去除SSID自带的引号 val frequency = result.frequency ssidFrequencyMap.getOrPut(ssid) { mutableSetOf() }.add(frequency) } // 检查目标SSID的频段支持情况 val targetSsid = "你的Wi-Fi名称" ssidFrequencyMap[targetSsid]?.let { frequencies -> val supports24G = frequencies.any { it in 2400..2483 } val supports5G = frequencies.any { it in 5150..5850 } when { supports24G && supports5G -> println("双频网络(2.4G+5G)") supports24G -> println("仅支持2.4GHz") supports5G -> println("仅支持5GHz") else -> println("未知频段") } }
三、自动切换到5GHz频段
双频Wi-Fi的SSID相同但BSSID不同,需找到对应5G频段的BSSID再发起连接:
Android 10及以上(API 29+)使用WifiNetworkSpecifier
val targetSsid = "你的Wi-Fi名称" val targetPassword = "你的Wi-Fi密码" // 从扫描结果中筛选5G频段的BSSID val targetBssid = scanResults.firstOrNull { it.SSID.removeSurrounding("\"") == targetSsid && it.frequency in 5150..5850 }?.BSSID targetBssid?.let { bssid -> val specifier = WifiNetworkSpecifier.Builder() .setSsid(targetSsid) .setBssid(MacAddress.fromString(bssid)) .setWpa2Passphrase(targetPassword) // 根据Wi-Fi加密方式调整(如WPA3) .build() val request = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .setNetworkSpecifier(specifier) .build() val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { // 连接成功,绑定当前进程到该网络 val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.bindProcessToNetwork(network) } override fun onUnavailable() { // 连接失败,可做重试或提示处理 } } val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager connectivityManager.requestNetwork(request, networkCallback) }
Android 10以下使用WifiConfiguration
val targetSsid = "你的Wi-Fi名称" val targetPassword = "你的Wi-Fi密码" val targetBssid = scanResults.firstOrNull { it.SSID.removeSurrounding("\"") == targetSsid && it.frequency in 5150..5850 }?.BSSID targetBssid?.let { bssid -> val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager val config = WifiConfiguration() config.SSID = "\"$targetSsid\"" config.BSSID = bssid config.preSharedKey = "\"$targetPassword\"" // WPA/WPA2加密配置,WEP需另行处理 val networkId = wifiManager.addNetwork(config) wifiManager.enableNetwork(networkId, true) wifiManager.reconnect() }
四、注意事项
- Android 10+对后台Wi-Fi扫描有严格限制,建议在前台场景下执行扫描操作。
- 不同厂商的设备可能对Wi-Fi权限有额外限制,需测试适配。
- 切换网络时需确保设备处于Wi-Fi开启状态,且目标网络信号稳定。
内容的提问来源于stack exchange,提问作者nikdim_03
相关产品推荐
相关产品推荐

