4

Android Fused Location API - 如何在一个应用程序PRIORITY_BALANCED_POWER_ACCURACY中使用PRIORITY_HIGH_ACCURACY

嗨,我正在开发一个需要定期发送位置更新的应用程序。我已将 Fused Location API 与位置未决意图一起使用。(更新间隔 60 秒,最小位移 100m)。我已经注册了一个 locationclient 挂起的意图PRIORITY_BALANCED_POWER_ACCURACY和意图服务。当位置改变时,IntentService 被调用,这对于少数试驾来说效果很好。但这只是有时有效。当它不起作用时,我希望使用PRIORITY_HIGH_ACCURACY

我注意到,当我使用它时PRIORITY_HIGH_ACCURACY,它提供了很好的位置,但电池使用率很高。所以我决定同时PRIORITY_HIGH_ACCURACY使用PRIORITY_BALANCED_POWER_ACCURACYActivityRecognition。

最初程序从PRIORITY_BALANCED_POWER_ACCURACY使用 LocationPendingIntent 开始,当 2 分钟没有更新时,我使用 LocationListener (和 onLocationChanged 方法)实现PRIORITY_BALANCED_POWER_ACCURACY,如果仍然没有我调用的位置PRIORITY_HIGH_ACCURACY

我在这里面临的问题是,一旦切换到PRIORITY_HIGH_ACCURACY, LocationPendingIntent (注册到PRIORITY_BALANCED_POWER_ACCURACY)总是PRIORITY_HIGH_ACCURACY在此之后使用。我通过调用 .removeupdates(locationListener); 在 onLocationChanged 方法结束时删除位置更新;但是 GPS 图标每分钟都会出现。

我曾想过对 onLocationChanged 方法使用静态方法,但我知道这对于 android 应用程序来说不是一个好习惯。同时使用 PendingIntent 和 onLocationChanged 是否存在任何已知问题?你能建议我的问题的解决方案吗?

权限设置为:

uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

对此的任何帮助将不胜感激。

谢谢。

4

1 回答 1

0

(我意识到这是一个很晚的回应,但刚刚解决了这个问题,也许这些信息对某人有好处)。我想做一些非常相似的事情,但我遇到了两个问题:

  • 当我使用与我最初请求更新完全相同的参数时,我发现 removeLocationUpdates 失败 - 也就是说,我没有收到任何错误,结果回调表明取消工作正常。但是在调用 removeLocationUpdates 之后,位置更新一直在发生。我发现在这里的代码中使用参数 0 和 null 对我来说可以成功停止更新:

    Intent selfIntent = new Intent(ACTION_CHECK_LOCATION, null, getApplicationContext(), <ServiceClass>.class); PendingIntent selfPendingIntent = PendingIntent.getService(getApplicationContext(), 0, selfIntent, 0);

  • 我可能在对 requestLocationUpdates 和 removeLocationUpdates 的调用之间存在冲突。我不想意外停止我刚刚请求的更新,所以我最终得到了两个单独的类,一个用于处理每种类型的更新。

就我而言,我没有前台应用程序,而是使用服务进行后台更新。您可以在此处查看我的代码 - https://github.com/Esri/arcgis-runtime-demos-android/tree/master/2015-DS/LocalGeofence - 请注意,我正在使用另一个 SDK(Esri ArcGIS Runtime for Android SDK,我为 Esri 工作),但您可以忽略这一点,只需查看两个服务 GeofenceServiceNormal 和 GeofenceServiceFast,以及它们如何与 Fused Location API 交互。

我最终得到了两个服务类(以避免 requestLocationUpdates 和 removeLocationUpdates 冲突)。每个服务识别何时必须更改为另一个服务(请参阅 handleActionChangeToFastUpdates 和 handleActionChangeToNormalUpdates);然后它为自己调用 removeLocationUpdates,并为其他服务类调用 requestLocationUpdates。这项服务对我来说效果很好-也许您可以使用类似的结构。

于 2015-03-26T15:09:37.960 回答