如何获取已连接WiFi的SSID?两种实现方法遇问题求指导
Android API 30+ 获取已连接WiFi SSID的解决方案
问题回顾
- 原方案使用
WifiManager.connectionInfo.ssid在API 27设备正常,但API 30+(Android 11)设备返回<unknown ssid>,开启位置服务后恢复,但该API已被标记为废弃。 - 尝试通过
ConnectivityManager.NetworkCallback获取transportInfo时始终为null,需替代废弃API的有效方案。
必备权限配置
确保清单文件中添加以下权限,并已动态申请定位权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- API 33+ 新增权限,可替代部分定位权限场景 --> <uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
注意:API 30+ 必须授予精确位置权限,且设备位置服务处于开启状态,否则无法获取SSID。
有效实现方案
方案1:获取当前已连接的WiFi SSID
直接查询当前活跃网络的WiFi信息:
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager // 获取当前活跃网络 connectivityManager.activeNetwork?.let { activeNetwork -> val networkCapabilities = connectivityManager.getNetworkCapabilities(activeNetwork) networkCapabilities?.takeIf { it.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) }?.let { capabilities -> val wifiInfo = capabilities.transportInfo as WifiInfo // 处理获取到的SSID,注意SSID会带双引号,可通过replace("\"", "")去除 val ssid = wifiInfo.ssid.replace("\"", "") textField.text = ssid } }
方案2:监听WiFi网络状态变化
如果需要实时监听WiFi连接状态变化,使用registerNetworkCallback:
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager val networkRequest = NetworkRequest.Builder() .addTransportType(NetworkCapabilities.TRANSPORT_WIFI) .build() val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { super.onAvailable(network) updateWifiSsid(network) } override fun onCapabilitiesChanged(network: Network, networkCapabilities: NetworkCapabilities) { super.onCapabilitiesChanged(network, networkCapabilities) if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) { updateWifiSsid(network) } } private fun updateWifiSsid(network: Network) { connectivityManager.getNetworkCapabilities(network)?.let { capabilities -> val wifiInfo = capabilities.transportInfo as WifiInfo val ssid = wifiInfo.ssid.replace("\"", "") textField.text = ssid } } } // 在生命周期开始时注册回调(如onStart) connectivityManager.registerNetworkCallback(networkRequest, networkCallback) // 在生命周期结束时注销回调(如onStop) // connectivityManager.unregisterNetworkCallback(networkCallback)
常见问题排查
transportInfo为null的原因:- 未满足权限或位置服务要求:检查是否授予精确位置权限,且设备位置服务已开启。
- 网络类型判断遗漏:务必先通过
hasTransport(NetworkCapabilities.TRANSPORT_WIFI)确认是WiFi网络。 - 重复调用API:不要同时使用
requestNetwork和registerNetworkCallback,前者用于请求网络,后者用于监听变化,混用会导致逻辑异常。
内容的提问来源于stack exchange,提问作者AlexVs86
相关产品推荐
相关产品推荐

