使用 FusedLocationProviderClient 的位置前台服务仅在选择位置权限选项“每次询问”时收集一次数据

问题描述 投票:0回答:1

如标题所示,我使用

FusedLocationProviderClient
每隔一段时间收集位置数据,当用户在提示位置权限时选择“每次询问”时,位置回调会被调用一次......然后就不再调用再次。

此外,每当我在初始收集后检查位置权限时,它总是会告诉我该应用程序具有位置权限,尽管它仍然不会收集任何数据。看起来好像我在收集一次后就不再拥有权限了(与文档所说的相反;请参阅本文的结尾)。

如果我退出我的应用程序并重新登录(不终止进程),它不会再次请求权限,因为操作系统告诉应用程序它已经被授予,但是当

FusedLocationProviderClient
启动时,它试图抓住一个点,但它已经过时了,并且它的时间戳大约是我first授予“每次询问”权限的时间。

我在这里寻找的主要内容是:在这种情况下有没有办法正确处理“每次都询问”?或者这可能是

FusedLocationProviderClient
的一个错误,尽管已授予权限,但选择“每次询问”时它不会收集数据?

我的应用程序流程如下所示:

  • 用户登录
  • 如果用户没有授予位置权限,则会提示他们授予该权限。
  • 成功登录后,我的
    LocationService
    就会启动,每分钟都会收集位置数据
  • 成功注销后,数据收集停止

这样,仅在登录屏幕上请求权限,然后应用程序将持续收集位置数据。

我的位置代码看起来像这样。想象一下,通过选择“每次询问”授予权限后立即调用此代码。

private var fusedLocationClient: FusedLocationProviderClient? = null
private lateinit var locationCallback: LocationCallback
...

locationCallback = object : LocationCallback() {
  override fun onLocationResult(locRes: LocationResult) {
    // I perform the permission check here, and it still says granted, even though it's acting as if it is not
  }
}

val locationRequest = LocationRequest.Builder(60000) // 1 minute
  .setPriority(HIGH_ACCURACY)
  .setMinUpdateIntervalMillis(60000) // 1 minute
  .build()

val locationBuilder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)

val settingsResult = LocationServices.getSettingsClient(appContext).checkLocationSettings(locationBuilder.build())

settingsResult.addOnCompleteListener { locationSettingsTask ->
  fusedLocationClient!!.requestLocationUpdates(locationRequest, locationCallback, null)
}

我参考了一次性权限行为的Android文档,看起来它应该在我的场景中工作,除非我做错了什么:

如果您在 Activity 可见时启动前台服务,然后用户将您的应用移至后台,则您的应用可以继续访问数据,直到前台服务停止。

在我的应用程序中,登录页面正在请求权限,并启动收集位置的服务。

android geolocation location android-permissions fusedlocationproviderclient
1个回答
0
投票

解决方案最终是将我的

play-services-location
依赖项从
21.0.1
更新为
21.3.0
,这是目前最新的。所以,这一定是他们意识到的一个错误,并且幸运的是,已修复!

© www.soinside.com 2019 - 2024. All rights reserved.