如标题所示,我使用
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 可见时启动前台服务,然后用户将您的应用移至后台,则您的应用可以继续访问数据,直到前台服务停止。
在我的应用程序中,登录页面正在请求权限,并启动收集位置的服务。
解决方案最终是将我的
play-services-location
依赖项从 21.0.1
更新为 21.3.0
,这是目前最新的。所以,这一定是他们意识到的一个错误,并且幸运的是,已修复!