我想要实现一个不断将设备的位置发送到Web服务的应用程序。查看文档,我找到了Geolocation类和一些讨论位置跟踪的文章:
实现这些文章中讨论的两个示例项目,我注意到每个位置更新都不会触发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<GeoCoordinate> 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提出的here一样,我可以使用Geolocator类,但有一些限制。
3)我可以在后台使用GeoCoordinateWhatcher吗?如果是,怎么样?
我的目标是实现位置跟踪应用程序,没有延迟,甚至可以在后台运行。做这个的最好方式是什么?应用程序应跟踪设备的位置并不断更新Web服务(即使在后台)。我怎样才能做到这一点?什么是最好的方法?我知道Windows Phone Apps生命周期,我可以接受后台执行的一些限制。背景限制是什么?
答案 0 :(得分:11)
不幸的是,Windows Phone 8.1不支持后台连续跟踪。如果您需要此功能,则必须开发Windows Phone 8应用程序。希望他们能够解决8.2,9或其他任何问题!
答案 1 :(得分:6)
有一种方法可以实现位置跟踪,但它有其局限性。对于体育应用程序来说,这还不够,但对于许多其他用例来说,它还是适合的。使用Geofence
和BackgroundTask
与LocationTrigger
这是一个例子:
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工作得很好,所以你最好自己检查一下。
答案 2 :(得分:0)
我做的和@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));