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

如何获取已连接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的原因:
    1. 未满足权限或位置服务要求:检查是否授予精确位置权限,且设备位置服务已开启。
    2. 网络类型判断遗漏:务必先通过hasTransport(NetworkCapabilities.TRANSPORT_WIFI)确认是WiFi网络。
    3. 重复调用API:不要同时使用requestNetwork和registerNetworkCallback,前者用于请求网络,后者用于监听变化,混用会导致逻辑异常。

内容的提问来源于stack exchange,提问作者AlexVs86

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 08:00:53