Android 11 wifi SSID 在后台未知,即使已授予位置权限

Android 11 wifi SSID is unknown in background even when lcoation permissions is granted

我在 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 10+(API 29 及更高版本) 上的正确行为,声明 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION权限不够

1.对于前景位置:

您还需要在服务中声明 foregroundServiceTypelocation 才能使用前台位置。

<service
    android:name="MyNavigationService"
    android:foregroundServiceType="location" ... >
    <!-- Any inner elements would go here. -->
</service>

或者如果您的代码 运行 在 Activity 中,activity 应该对用户可见。

2。对于后台位置:

正如 3c71 所说,您应该在应用的清单中声明 ACCESS_BACKGROUND_LOCATION 权限,以便在运行时请求后台位置访问。

由于 Google Play location policy,它可能会拒绝需要后台位置权限的应用程序。所以,我觉得前台位置应该是更好的选择。

官方文档: https://developer.android.com/training/location/permissions