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_LOCATION
或 ACCESS_FINE_LOCATION
权限不够
1.对于前景位置:
您还需要在服务中声明 foregroundServiceType
的 location
才能使用前台位置。
<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
我在 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_LOCATION
或 ACCESS_FINE_LOCATION
权限不够
1.对于前景位置:
您还需要在服务中声明 foregroundServiceType
的 location
才能使用前台位置。
<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