11

Chcę zrealizować aplikację, która nieustannie wysyła pozycję urządzenia do usługi sieciowej. Patrząc w dokumentacji, Znalazłem klasa geolokalizacji i niektóre artykuły gdzie pozycja śledzenia omówiono:Windows Phone 8.1 śledzenie lokalizacji

Realizacja obu projektów przykładowych omawianych w tych artykułach, nie mam Zauważyłem, że zdarzenie geolocator_PositionChanged() nie jest uruchamiane przy każdej aktualizacji pozycji. Wystąpiło opóźnienie (około 10/15 minut) między 2 wykonaniem zdarzenia. Dziwne jest to, że dzieje się tak nawet wtedy, gdy aplikacja jest uruchamiana na pierwszym planie (nie tylko w tle). Używam emulatora Windows Phone.

W mojej aplikacji mam kontrolę mapy, gdzie potrzebuję pokazać pozycję użytkownika, a więc potrzebuję, aby zdarzenie geolocator_PositionChanged() zostało poprawnie uruchomione dla każdej aktualizacji pozycji, bez opóźnień.

1) Jak mogę śledzić (bez opóźnień) pozycję urządzenia za pomocą klasy Geolocator?

Przeszukując sieć, znalazłem klasę GeoCoordinateWatcher, która zapewnia ciągłe śledzenie pozycji urządzenia. Jest to kod:

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); 
} 

Działa: watcher_PositionChanged() zdarzenie jest zwolniony bez opóźnień.

2) Dlaczego GeoCoordinateWatcher nie ma opóźnień? Jaka jest różnica między klasą GeoCoordinateWatcher a klasą Geolocator?

Wreszcie aplikacja powinna przesłać pozycję urządzenia do serwisu internetowego, nawet jeśli nie jest aktywna. Potrzebuję zadania w tle. Zgodnie z propozycją here Romasz, mogę korzystać z klasy Geolocator z pewnymi ograniczeniami.

3) Czy mogę używać GeoCoordinateWhatcher w tle? Jeśli tak, w jaki sposób?

Moim celem jest realizacja aplikacji śledzenia pozycji bez opóźnień, która działa nawet w tle. Jaki jest najlepszy sposób na zrobienie tego? Aplikacja powinna śledzić położenie urządzenia i stale aktualizować serwis internetowy (nawet w tle). Jak mogę to zrobić? Jakie jest najlepsze podejście? Wiem o cyklu życia Aplikacji Windows Phone i mogę zaakceptować pewne ograniczenia dotyczące wykonywania w tle. Jakie są ograniczenia tła?

Odpowiedz

11

Niestety, Windows Phone 8.1 nie obsługuje ciągłego śledzenia w tle. Jeśli chcesz tę funkcję, musisz opracować aplikację Windows Phone 8. Mam nadzieję, że naprawią to na 8,2, 9 lub cokolwiek innego!

+0

Dziękuję Gavin za odpowiedź. Proszę, czy możesz być bardziej konkretny? Czy jest jakaś dokumentacja Microsoft? Jeśli jest to możliwe w systemie Windows Phone 8, jak go zrealizować i dlaczego usunąć tę funkcję z systemu Windows Phone 8.1? –

+0

Po wyszukaniu tej odpowiedzi rzeczywiście szukałem linków do kopii zapasowej mojego wyciągu, ale nie mogłem znaleźć nic zwięzłego. Dostałem tę informację podczas imprezy Kickstart w systemie Windows Phone 8.1, której gospodarzem był Hannes Nel w kwietniu 2014 r. Zapewnił on przydatne slajdy pokazujące, jakie API są dostępne i które nie były dostępne w różnych 8 i 8 wersjach smaków projektów Windows Phone. Powodem, dla którego dobrze pamiętam ten fakt, jest to, że wygrałem Lumię 820 za udzielenie odpowiedzi na pytanie, co było możliwe tylko w Windows 8 API, a nie 8.1 API. Byłem rozczarowany, ponieważ nie mogłem z tego powodu uaktualnić mojej aplikacji do wersji 8.1. – Gavin

+0

Jest to powiedziane tutaj: http://msdn.microsoft.com/en-us/library/windowsphone/develop/dn642084(v=vs.105).aspx> Ciągłe wykonywanie w tle nie jest obsługiwane dla aplikacji Silverlight 8.1 – Depechie

6

Istnieje sposób, w jaki można uzyskać śledzenie lokalizacji, ale ma ona swoje ograniczenia. To nie wystarczy dla aplikacji sportowej, ale w wielu innych przypadkach będzie pasować. Użyj Geofence a BackgroundTask z LocationTrigger

tutaj przykład:

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(); 

To doda koło Geofence z centrum swojego położenia i promieniu 25 metrów. Po wyjściu z tego określonego obszaru zostaje uruchomione zadanie w tle. Pamiętaj, aby zaktualizować geofence do nowej pozycji, a będziesz informowany, gdy kiedykolwiek użytkownik przekroczy 25 metrów.

Należy jednak pamiętać, że BackgroundTask nie musi działać, gdy tylko opuścisz granicę ogrodzenia. Może mieć opóźnienie do kilku minut (nigdy nie zauważyłem opóźnienia dłuższego niż minutę po opuszczeniu kręgu). Jak już powiedziałem: nie wystarczy na aplikację sportową, ale może pasować do twoich potrzeb.

celu uzyskania bardziej szczegółowych informacji znajdziesz tutaj: http://msdn.microsoft.com/en-us/library/windows.devices.geolocation.geofencing.aspx

Dla przykładowego projektu zajrzyj tutaj: https://code.msdn.microsoft.com/windowsapps/Geofencing-and-geolocation-d7ea0ef8

Uwagi: Czytałem, że jest wysoce zalecane, aby nie używać promień mniejszy niż 50. Ale w moich testach 25 działało dobrze, więc lepiej sprawdź sam siebie.

+0

Czy możesz udostępnić przykładowy kod, którego użyłeś –

+0

@ThilinaAkalanka oraz przykładowy kod został zamieszczony powyżej. Czego ci brakuje? – christoph

+0

jest możliwe, aby wysłać lokalizację do usługi mobilnej lazuru w ramach tego zadania tła –

0

Zrobiłem dokładnie to samo co @christoph ... Właśnie dodałem zdarzenie Entered ... Moje aktualizacje pojawiają się co 2 minuty, ZAWSZE.

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));