簡體   English   中英

Windows Phone 8.1位置跟蹤

[英]Windows Phone 8.1 location-tracking

我想實現一個不斷向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 在這里提出的,我可以使用Geolocator類,但有一些限制。

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

我的目標是實現一個沒有延遲的位置跟蹤應用程序,甚至可以在后台運行。 做這個的最好方式是什么? 應用程序應跟蹤設備的位置並不斷更新Web服務(即使在后台)。 我怎樣才能做到這一點? 什么是最好的方法? 我知道Windows Phone Apps生命周期,我可以接受后台執行的一些限制。 背景限制是什么?

遺憾的是,Windows Phone 8.1不支持后台連續跟蹤。 如果您需要此功能,則必須開發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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM