【问题标题】:FusedLocationProviderClient always reports LocationAvailability falseFusedLocationProviderClient 总是报告 LocationAvailability false
【发布时间】:2021-11-03 16:08:51
【问题描述】:

我有一个应用程序已经运行了几年,但最近,我收到了有关定位系统无法正常运行的报告。 我已将问题追溯到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!
    }
}

【问题讨论】:

    标签: android google-maps kotlin fusedlocationproviderapi android-fusedlocation


    【解决方案1】:

    此问题是由新的 Google Play 服务更新(版本 21.30.16)引起的。

    见:https://issuetracker.google.com/issues/198176818

    根据 2021 年 9 月 9 日,他们说:

    我们暂时回滚了一些逻辑 isLocationAvailable() 并且您应该注意行为恢复正常 在接下来的 24 小时左右。

    【讨论】:

    • 谢谢 - 这就是我想听到的:我一直都是对的 :-)
    • 来自 google 的问题日志中还有更多内容可能值得一读:issuetracker.google.com/issues/198176818#comment37 - 可以说使这种状态毫无价值。
    • 至少它给出了预期的提示。 F.x.当用户从设置中启用/禁用位置时,您确实会接到 truefalse 的电话。这是非常重要的。但目前,在这两种情况下你都会得到false:不可接受。好吧;希望他们很快就会发布更新。
    • 但现在我们所有的客户都认为这是我们的错,并对我们的系统失去信心......一周后仍然崩溃!
    • 更新:截至 21.33.14 版 Play Services 仍未修复,尽管承诺“在 24 小时内”解决
    【解决方案2】:

    您的问题可能与更新后的有关用户位置的 GooglePlay 政策有关。几年前生效的 GDPR(通用数据保护条例)规定用户的位置是 personally identifiable information,因此现在需要用户同意才能使用这些数据。

    这只是意味着在清单权限中添加 ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION 是不够的。您需要在运行时向用户请求许可。

    有关在运行时请求位置权限的更多信息,请参阅 herehere

    【讨论】:

    • 谢谢,但正如我所提到的,权限是公平公正的。这当然也意味着运行时权限。问题是onLocationAvailability(availability: LocationAvailability?) 回调。当位置可用或不可用时,应用程序用户有不同的选择,当回调总是告诉我它不可用时,很难向应用程序用户提供明确的反馈。我最好的解决方法是依靠onLocationResult:如果他们开始进入,可以在应用程序中启用基于位置的功能,如果没有,我必须禁用这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2018-05-14
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2013-08-13
    相关资源
    最近更新 更多