我在 Android 11 中测试了这段代码
val networkRequest = NetworkRequest.Builder().apply {
addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
}.build()
connectivityManager.registerNetworkCallback(networkRequest, object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
val wifiName = getCurrentlyConnectedName() ?: return
val wifiMac = getCurrentlyConnectedMac() ?: return
Timber.d("WifiStateManager onAvailable() called with: network = [$wifiName]")
}
override fun onLost(network: Network) {
super.onLost(network)
Timber.d("WifiStateManager onLost() called with: network = [$network]")
}
})
并注意到一个奇怪的行为。当应用程序处于后台时 wifi ssid
总是 <unknown>
(请注意,100% 授予位置权限)。当应用程序在前台时,一切正常,我得到正确的 wifi ssid
.
为什么会这样?如何在 Android 11 上即使应用程序处于后台也能获取 wifi SSID?
最佳答案
很奇怪,这还没有早点得到回答。
位置权限现在在 Android 11+ 上具有后台访问的特殊情况。可以授予一个应用程序访问位置权限,但只能在前台。后台位置权限需要在 Play Console 上发布特殊请求,并获得相应的权限:
android.permission.ACCESS_BACKGROUND_LOCATION
从定位 API 29 开始,我相信这在 Play 商店中已经是强制性的。
关于即使授予位置权限,Android 11 wifi SSID 在后台也是未知的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65180052/