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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 23:33:14