我需要为我的应用提供始终跟踪手机位置的服务。它用于创建用户行进的路径,将显示在应用程序中,并且应该在行走和其他移动方式之间进行区分。 该位置应具有较高的准确性,时间戳和速度,并保存在sql lite db中,以便在我的应用中进一步使用。
解决此问题的最佳方法是什么?我遇到后台服务无法经常获取位置的情况。我的最后一招就是使其成为前台服务,但也许有人已经解决了该问题。 (例如,是否可以使用可用格式获取Google跟踪的位置数据?) 预先感谢!
修改: 对不起,我想说清楚。 问题在于,在我的研究过程中,我发现有几种获取所需数据的方法。位置管理器和融合位置。 所有这些都受到服务在后台运行时被允许获取GPS数据的频率的限制,这可能会降低路径精度。一些临时对象要使其成为前台服务,这样它就不会受到相同的限制,但这不是我想要实现的。
提出一个更精确的问题:在不消耗过多能量的情况下,长时间使用后台服务收集准确的GPS位置数据的最佳方法是什么?它也可以分批使用,因为它不是实时使用,而是稍后进行评估。
答案 0 :(得分:1)
尝试只问一些具体问题。否则,没人会帮助或回答您。由于您是在该平台上的新手,所以我会尽力回答您的问题。
首先。 “ Google跟踪的数据”来自类型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和其他使设备进入睡眠状态的功能。但是您可以使用WakefulBroadcastReciever
和AlarmManager
处理此问题。您将创建一个警报,该警报会发送一个意图,接收方将接收到该意图,如果服务设置为“脱机”,则接收方将重新启动服务。但是请小心处理,因为它会耗尽设备的电池电量,我不建议这样做!仅用于某些特殊的业务用途。