FusedLocationProviderClient.getCurrentLocation():调用此方法的后台应用程序将在后台位置限制下受到限制

问题描述

the docs 中,FusedLocationProviderClient.getCurrentLocation()内容如下:

方法可能会返回几秒钟前的位置,但永远不会返回更旧的位置。这适用于需要单个新当前位置的前台应用程序。

调用方法后台应用程序将在后台位置限制下受到限制,因此后台应用程序可能会发现该方法更频繁地返回空位置。

“将被限制”的含义是什么?

在我的情况下,我有一个最多每 30 分钟更新一次的小部件。授予适当的位置权限(前台后台)后,我已经可以使用 FusedLocationProviderClient.getLastLocation() 访问最后一个已知位置,并且运行良好。

但我想探索一种更积极的方法,使用 getCurrentLocation() 而不是 getLastLocation()。对于前台没有应用程序的小部件,即使将 LocationRequest.PRIORITY_HIGH_ACCURACY 传递给 getCurrentLocation(),我也从未看到状态栏中出现小“位置”图标(地图图钉图标),正如我所期望的如果设备正在主动请求新的位置修复。是的,已请求并授予 ACCESS_FINE_LOCATION 权限。在应用程序中(在前台)使用相同的方法调用,我确实看到了“位置”图标。

那么,对于小部件来说,如果它会以某种方式受到严重阻碍,那么在后台使用 getCurrentLocation() 而不是 getLastLocation() 有什么真正的好处吗?有时它似乎需要大约 30 秒才能完成(在任何位置访问的状态栏中都没有可见的标志)然后返回一个 null 位置,那么它实际上在做什么?

我可以启动一个前台服务(带通知),但如果用户无论如何都要看到(通过状态栏中的“位置”图标)该位置正在被主动访问,这似乎有点矫枉过正。

那么“节流”究竟是什么?只是限制频率(小部件最多每 30 分钟更新一次,所以它几乎不“频繁”)?或者限制准确性(例如没有 GPS)?

解决方法

我认为可能与这些background location limits有关:

为了降低功耗,Android 8.0(API 级别 26)限制了应用在后台运行时检索用户当前位置的频率。在这种情况下,应用每小时只能接收几次位置更新。