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 是不够的。您将需要在运行时请求用户的许可。

有关在运行时请求位置权限的详细信息,请参阅here and here

此问题是由新的 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.