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

Posted

技术标签:

【中文标题】Android Fused Location API - 如何在一个应用程序中使用 PRIORITY_BALANCED_POWER_ACCURACY 和 PRIORITY_HIGH_ACCURACY?【英文标题】:Android Fused Location API - how to use PRIORITY_BALANCED_POWER_ACCURACY and PRIORITY_HIGH_ACCURACY in one application? 【发布时间】:2013-09-14 10:29:44 【问题描述】:

android Fused Location API - 如何在一个应用程序中使用PRIORITY_BALANCED_POWER_ACCURACYPRIORITY_HIGH_ACCURACY

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

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

最初程序从 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" />

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

谢谢。

【问题讨论】:

有什么消息吗?这正是我所经历的。 【参考方案1】:

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

当我使用与最初请求更新完全相同的参数时,我发现 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。这项服务对我来说效果很好 - 也许您可以使用类似的结构。

【讨论】:

以上是关于Android Fused Location API - 如何在一个应用程序中使用 PRIORITY_BALANCED_POWER_ACCURACY 和 PRIORITY_HIGH_ACCURACY?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FUSED LOCATION API 优化电池 - Android

Android:关闭位置时,Google Fused Location 不起作用

Android:使用 Fused Location Provider 检查是不是启用了位置服务

Android - Google Maps V2 无法使用 Fused Location

Android 的 Fused Location Provider 的 LocationRequest 优先级有啥区别?

如何使用网络在Android中使用Fused Location Provider获取位置?