通过android中的后台服务获取准确的路径历史

Posted

技术标签:

【中文标题】通过android中的后台服务获取准确的路径历史【英文标题】:Getting an accurate path history via background service in android 【发布时间】:2019-09-08 17:00:36 【问题描述】:

我的应用需要一个始终跟踪手机位置的服务。它用于创建用户行进的路径,将显示在应用程序中,并且应该可以区分步行和其他移动方式。 该位置应具有高精度,并结合时间戳和速度,并保存在 sql lite db 中,以便在我的应用程序中进一步使用。

解决这个问题的最佳方法是什么?我遇到后台服务无法经常获取位置。我最后的手段是让它成为前台服务,但也许有人已经解决了这个问题。 (例如,是否有可能以可用的格式获取谷歌跟踪的位置数据?) 提前致谢!

编辑: 很抱歉我不够清楚。 问题是,在我的研究过程中,我发现有几种方法可以获取所需的数据。位置管理器和融合位置。 所有这些都受到服务在后台运行时允许您获取 GPS 数据的频率的限制,这可能会降低路径准确性。一些解决方案使其成为前台服务,因此它不会受到相同的限制,但这不是我想要实现的东西。

提出一个更精确的问题:在不消耗太多能量的情况下,使用后台服务长时间收集准确(!)GPS 位置数据的最佳方法是什么?也可以分批使用,因为它不是实时使用的,而是稍后评估的。

【问题讨论】:

【参考方案1】:

试着只问一些具体的问题。否则,没有人知道如何帮助或回答你。既然你是这个平台的新人,我会尽力回答你的问题。

首先。 “谷歌跟踪的数据”来自Location 类型。您可以使用LocationManager 请求位置更新。

只需在您的首选课程中注册位置更新:

    # Get Instance of LocationManager
    LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    # Create Criteria / What Accuracy of do you need? No Requirement means also very week locations will be used
    Criteria gpsCriteria = new Criteria();
    gpsCriteria.setAccuracy(Criteria.NO_REQUIREMENT);
    gpsCriteria.setAltitudeRequired(false);
    gpsCriteria.setBearingAccuracy(Criteria.NO_REQUIREMENT);
    gpsCriteria.setCostAllowed(false);
    gpsCriteria.setPowerRequirement(Criteria.NO_REQUIREMENT);
    // Get the wanted provider
    String gpsProvider = locationManager.getBestProvider(gpsCriteria, true);

    // Request for Location Updates your Class must implement a LocationListener Every second a location is received
    locationManager.requestLocationUpdates(gpsProvider, 1000, 0, this);
    Location location = locationManager.getLastKnownLocation(gpsProvider);

在你的类中,你实现了上面提到的 LocationListener。在onLocationChange 中,您可以获得设备的位置更新。我不知道你想如何显示用户的轨迹。但是您可以从此位置对象获取纬度和经度。您还有质量等指标。

@Override
public void onLocationChanged(Location location) 
     location.getLatitude() ...

如果您想一直跟踪位置,则必须实现 BackgroundService。您在onStartCommand 中的位置更新请求。但是,您必须处理使设备进入睡眠状态的 DeepSleep 和其他功能。但是您可以使用WakefulBroadcastRecieverAlarmManager 来处理这个问题。您创建了一个警报,该警报发送接收者接收到的意图,如果服务设置为离线,接收者将重新启动服务。但要小心处理,因为它会耗尽设备的电池,我不推荐!仅用于一些特殊的业务用途。

【讨论】:

以上是关于通过android中的后台服务获取准确的路径历史的主要内容,如果未能解决你的问题,请参考以下文章

通过AsyncTask访问后台后得到的返回数据在Android端显示

如何在后台运行 android 服务 24x7 以获取用户的位置

融云 SDK 新用户入群加载历史消息

iOS中的后台获取

LocationListener 在 android 服务中的某个时间后不提供更新

如何通过后台服务每天在android中的特定时间重复通知