FusedLocationProviderClient 始终报告 LocationAvailability false
FusedLocationProviderClient always reports LocationAvailability false
我有一个应用程序已经运行了几年,但最近,我收到有关定位系统无法正常运行的报告。
我已将问题追踪到 LocationCallback.onLocationAvailability(availability: LocationAvailability?)
。它总是用 availability.isLocationAvailable = false
调用
描述表明它是假的,这意味着我不能指望从其他函数获得任何位置LocationCallback.onLocationResult(locationResult: LocationResult?)
但结果很好,而且位置似乎足够正确。
有人可以告诉我是否可以简单地忽略 isLocationAvailable = false
并按原样使用位置结果,而不冒任何获得错误读数或低准确度等风险?
我已经尝试过对 LocationRequest 进行不同的设置,并且没有任何问题 - 除了可用性仍然被调用为 false。结果本身很好。
权限是公平和公正的,我也试过只用 ACCESS_FINE_LOCATION
,只用 ACCESS_COARSE_LOCATION
,并且两者都启用。
设备上已启用位置。
在过去几周内,FusedLocation 系统的内部运作方式是否发生了变化?它多年来一直运行良好?
代码:
var locationRequest: LocationRequest = LocationRequest.create().apply {
interval = 10000
fastestInterval = 5000
priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
}
在初始化和开始位置更新时,我使用以下片段:
val locationClient = LocationServices.getFusedLocationProviderClient(this)
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
task.addOnSuccessListener { locationSettingsResponse ->
locationClient?.requestLocationUpdates(locationRequest, locationCallback, null)
}
并使用此 LocationCallback:
val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
if (locationResult.locations.isNotEmpty()) {
val location = locationResult.locations[0]
}
}
override fun onLocationAvailability(availability: LocationAvailability?) {
availability?.isLocationAvailable <-- This is always false!
}
}
您的问题可能与更新后的有关用户位置的 GooglePlay 政策有关。几年前生效的 GDPR(通用数据保护条例)规定用户的位置是 personally identifiable information,因此现在需要用户同意才能使用此数据。
这只是意味着在清单权限中添加 ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION 是不够的。您将需要在运行时请求用户的许可。
此问题是由新的 Google Play 服务更新(版本 21.30.16)引起的。
参见:https://issuetracker.google.com/issues/198176818
根据 2021 年 9 月 9 日,他们说:
We have temporarily rolled back some of the logic around
isLocationAvailable() and you should note behavior returning to normal
over then next 24 hours or so.
我有一个应用程序已经运行了几年,但最近,我收到有关定位系统无法正常运行的报告。
我已将问题追踪到 LocationCallback.onLocationAvailability(availability: LocationAvailability?)
。它总是用 availability.isLocationAvailable = false
描述表明它是假的,这意味着我不能指望从其他函数获得任何位置LocationCallback.onLocationResult(locationResult: LocationResult?)
但结果很好,而且位置似乎足够正确。
有人可以告诉我是否可以简单地忽略 isLocationAvailable = false
并按原样使用位置结果,而不冒任何获得错误读数或低准确度等风险?
我已经尝试过对 LocationRequest 进行不同的设置,并且没有任何问题 - 除了可用性仍然被调用为 false。结果本身很好。
权限是公平和公正的,我也试过只用 ACCESS_FINE_LOCATION
,只用 ACCESS_COARSE_LOCATION
,并且两者都启用。
设备上已启用位置。
在过去几周内,FusedLocation 系统的内部运作方式是否发生了变化?它多年来一直运行良好?
代码:
var locationRequest: LocationRequest = LocationRequest.create().apply {
interval = 10000
fastestInterval = 5000
priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
}
在初始化和开始位置更新时,我使用以下片段:
val locationClient = LocationServices.getFusedLocationProviderClient(this)
val builder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
task.addOnSuccessListener { locationSettingsResponse ->
locationClient?.requestLocationUpdates(locationRequest, locationCallback, null)
}
并使用此 LocationCallback:
val locationCallback = object : LocationCallback() {
override fun onLocationResult(locationResult: LocationResult?) {
locationResult ?: return
if (locationResult.locations.isNotEmpty()) {
val location = locationResult.locations[0]
}
}
override fun onLocationAvailability(availability: LocationAvailability?) {
availability?.isLocationAvailable <-- This is always false!
}
}
您的问题可能与更新后的有关用户位置的 GooglePlay 政策有关。几年前生效的 GDPR(通用数据保护条例)规定用户的位置是 personally identifiable information,因此现在需要用户同意才能使用此数据。
这只是意味着在清单权限中添加 ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION 是不够的。您将需要在运行时请求用户的许可。
此问题是由新的 Google Play 服务更新(版本 21.30.16)引起的。
参见:https://issuetracker.google.com/issues/198176818
根据 2021 年 9 月 9 日,他们说:
We have temporarily rolled back some of the logic around isLocationAvailable() and you should note behavior returning to normal over then next 24 hours or so.