Android Kotlin:当应用程序处于休眠模式时获取位置

Android Kotlin : Getting location when app is in doze mode

我正在尝试每 2 秒获取应用程序用户的当前位置。

我已经在使用带通知的前台服务(当应用程序在后台时可以记录位置)。 但是当应用程序进入打瞌睡模式时,它会在屏幕变黑后继续提供 3 个位置。但随后将停止向我提供位置更新。

我正在使用 FusedLocationProviderClient 获取我的当前位置。 我有一个 WakeLock 来保持服务 运行 并且这有效。为了测试这一点,我有一个协程运行,我可以做到println("test"),但是当我想要我的位置时,我什么也得不到。

fusedLocationProviderClient?.getCurrentLocation(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY, cancellationSource?.token)?
.addOnSuccessListener {
   val loc = it
   println("${loc.latitude},${loc.longitude}")
   postNewLocation(loc)
}?.addOnCanceledListener {
     println("cancel")
}

在我获得上次位置更新后,我得到了这个 LocationEngineResult == null

有谁知道我做错了什么?任何帮助或提示都会很棒。

对于上下文,我使用的是 Android 11 和 targetsdkversion 30。

我是 kotlin 的初学者,这是我必须完成的学校项目。

当设备处于休眠模式时,您无法接收位置信息。引用 Google 代表对 Google 问题跟踪器上某个问题的评论:

location not delivered in doze mode is by design. When doze mode is active we do best effort location delivery, i.e, we deliver location if the phone wakes up anyways for some other reason, but otherwise we will not wake up the phone just to deliver location

Reference

注:
您可能会说 Foreground Service 不应该受到休眠模式的影响。它不是。这是位置提供商。

更新:
Doze mode 仅在“如果用户在屏幕关闭的情况下将设备拔下并静止一段时间”才会激活。因此,如果设备固定在一个位置,则无需在该时间段内跟踪位置。

不知道打瞌睡模式是否是您的问题。电池优化是另一个问题。对于某些 phone,当打开电池优化并关闭屏幕时,位置提供程序将被禁用。您可以使用 PowerManager.getLocationPowerSaveMode() 检查此行为。模式是:

  1. LOCATION_MODE_FOREGROUND_ONLY
  2. LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF
  3. LOCATION_MODE_NO_CHANGE
  4. LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF

此外,某些 phone 供应商创建的 phone 不符合标准 Android 行为。检查 this.