Android API 31及以上如何使用非废弃接口正确获取WiFi SSID
Android API 31+ 非废弃方法获取WiFi SSID解决方案
问题原因分析
- 你当前主动调用
connectivityManager.getNetworkCapabilities()获取的WifiInfo返回<unknown ssid>,不是权限声明的问题,是主动查询的方式本身存在信息未同步的问题,Android系统仅会在网络状态变更触发回调时,才会在权限满足的前提下完整填充SSID字段。 - 旧的
WifiManager.connectionInfo已在API 31被官方标记为废弃,后续Android版本会逐步移除该接口,不可长期使用。
前置要求
- 除了你已在Manifest声明的权限外,必须在代码中动态申请
ACCESS_FINE_LOCATION运行时权限,获得用户授权后才能正常获取SSID,仅Manifest声明无法满足权限要求。 - 目标SDK >=33时无需额外新增权限,保持现有声明即可,同时需要确保设备定位开关处于开启状态,Android系统要求获取WiFi SSID必须开启定位功能。
官方推荐实现方案
使用ConnectivityManager.NetworkCallback监听WiFi网络连接状态,在回调中获取SSID,该方法为官方非废弃推荐方案,适配所有Android 12+版本:
import android.net.ConnectivityManager import android.net.Network import android.net.NetworkCapabilities import android.net.NetworkRequest import android.net.wifi.WifiInfo // 声明网络回调实例 private val wifiNetworkCallback = object : ConnectivityManager.NetworkCallback() { override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) // 校验当前网络为WiFi传输类型 if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { val wifiInfo = networkCapabilities.transportInfo as? WifiInfo ?: return // 原始SSID默认自带双引号,可按需格式化去除 val rawSsid = wifiInfo.ssid val formattedSsid = rawSsid.removeSurrounding("\"") Log.d("DEBUG", "获取到的SSID:$formattedSsid") } } } // 在页面onStart/onCreate生命周期中注册回调 private fun registerWifiCallback() { val connectivityManager = getSystemService(ConnectivityManager::class.java) // 构建仅监听WiFi网络的请求 val wifiRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build() connectivityManager.registerNetworkCallback(wifiRequest, wifiNetworkCallback) } // 在页面onStop/onDestroy生命周期中注销回调,避免内存泄漏 private fun unregisterWifiCallback() { val connectivityManager = getSystemService(ConnectivityManager::class.java) connectivityManager.unregisterNetworkCallback(wifiNetworkCallback) }
内容的提问来源于stack exchange,提问作者mbmc
相关产品推荐
相关产品推荐

