Windows Phone 8.1位置跟踪

我想实现一个不断向Web服务发送设备位置的应用程序。 查看文档,我找到了Geolocation类和一些讨论位置跟踪的文章:

  • 如何连续跟踪Windows Phone 8的电话位置
  • 如何在Windows Phone 8的后台运行位置跟踪应用程序

实现这些文章中讨论的两个示例项目,我注意到每个位置更新都不会触发geolocator_PositionChanged()事件。 两次执行事件之间有一段延迟(大约10/15分钟)。 奇怪的是,即使App在前台执行(不仅在后台),也会发生这种情况。 我正在使用Windows Phone模拟器。

在我的应用程序中,我有一个地图控件,我需要显示用户的位置,因此,我需要为每个位置更新正确触发geolocator_PositionChanged()事件,没有延迟。

1)如何使用Geolocator类跟踪(无延迟)设备的位置?

通过网络搜索,我找到了GeoCoordinateWatcher类,它提供了对设备的连续位置跟踪。 这是代码:

public MainPage() { InitializeComponent(); this.GetCoordinate(); } private void GetCoordinate() { var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High) { MovementThreshold = 1 }; watcher.PositionChanged += this.watcher_PositionChanged; watcher.Start(); } private void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs e) { //Get position data var pos = e.Position.Location; //Update mypos object mypos.update(pos.Latitude, pos.Longitude); //Update data on the main interface MainMap.SetView(mypos.getCoordinate(), MainMap.ZoomLevel, MapAnimationKind.Parabolic); } 

它的工作原理:watcher_PositionChanged()事件被触发而没有延迟。

2)为什么GeoCoordinateWatcher没有延迟? GeoCoordinateWatcher类和Geolocator类有什么区别?

最后,应用程序应将设备的位置发送到Web服务,即使它未处于活动状态。 所以,我需要一个后台任务。 正如Romasz 在这里提出的,我可以使用Geolocator类,但有一些限制。

3)我可以在后台使用GeoCoordinateWhatcher吗? 如果有,怎么样?

我的目标是实现一个没有延迟的位置跟踪应用程序,甚至可以在后台运行。 做这个的最好方式是什么? 应用程序应跟踪设备的位置并不断更新Web服务(即使在后台)。 我怎样才能做到这一点? 什么是最好的方法? 我知道Windows Phone Apps生命周期,我可以接受后台执行的一些限制。 背景限制是什么?

不幸的是,Windows Phone 8.1不支持后台连续跟踪。 如果您需要此function,则必须开发Windows Phone 8应用程序。 希望他们能为8.2,9或其他任何东西解决这个问题!

有一种方法可以实现位置跟踪,但它有其局限性。 这对于体育应用程序来说已经不够了,但对于许多其他用例来说它是合适的。 使用GeofenceBackgroundTaskLocationTrigger

这是一个例子:

 BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); Geolocator locator = new Geolocator(); locator.DesiredAccuracyInMeters = 10; locator.DesiredAccuracy = PositionAccuracy.High; Geoposition currentPosition = await locator.GetGeopositionAsync(TimeSpan.FromMinutes(1),TimeSpan.FromSeconds(30)); Geocircle fenceCircle = new Geocircle(currentPosition.Coordinate.Point.Position,25); Geofence newFence = new Geofence(GEOFENCE_NAME, fenceCircle, MonitoredGeofenceStates.Exited, false, TimeSpan.FromSeconds(1), DateTimeOffset.Now, TimeSpan.FromDays(30)); GeofenceMonitor.Current.Geofences.Add(newFence); BackgroundTaskBuilder observerTaskBuilder = new BackgroundTaskBuilder(); observerTaskBuilder.Name = OBSERVER_TASK_NAME; observerTaskBuilder.SetTrigger(new LocationTrigger(LocationTriggerType.Geofence)); observerTaskBuilder.TaskEntryPoint = OBSERVER_TASK_ENTRY_POINT; observerTaskBuilder.Register(); 

这将为您的位置中心添加一个地理围栏圆,半径为25米。 退出指定区域时,将触发后台任务。 确保将地理围栏更新到新位置,当用户移动超过25米时,您将收到通知。

但请记住,一旦离开围栏的边界, BackgroundTask就不需要运行。 它可能有几分钟的延迟(我从未注意到离开圆圈后超过一分钟的延迟)。 正如我所说:体育应用程序还不够,但它可能适合您的需求。

有关更多详细信息,请访问: http : //msdn.microsoft.com/en-us/library/windows.devices.geolocation.geofencing.aspx

有关示例项目,请访问: https : //code.msdn.microsoft.com/windowsapps/Geofencing-and-geolocation-d7ea0ef8

备注:我读到强烈建议不要使用小于50的半径。但在我的测试中,25运行良好,所以你最好自己检查一下。

我和@christoph完全一样……我刚刚添加了Entered事件……我的更新每2分钟发生一次,总是如此。

  Geoposition currentPosition = await locator.GetGeopositionAsync(TimeSpan.FromMinutes(1), TimeSpan.FromSeconds(30)); Geocircle fenceCircle = new Geocircle(currentPosition.Coordinate.Point.Position, 25); Geofence newFence = new Geofence("CURRENT_LOC" + Guid.NewGuid(), fenceCircle, MonitoredGeofenceStates.Exited | MonitoredGeofenceStates.Entered, false, TimeSpan.FromSeconds(1), DateTimeOffset.Now, TimeSpan.FromMinutes(10));