11

Ich möchte eine App realisieren, die kontinuierlich die Position des Geräts an einen Web-Service sendet. Suchen Sie in der Dokumentation, habe ich Geolocation-Klasse gefunden und einige Artikel in der Positionsverfolgung diskutiert wird:Windows Phone 8.1 Standort-Tracking

beiden Beispielprojekte Umsetzung in diesen Artikeln diskutiert, ich habe Beachten Sie, dass das Ereignis geolocator_PositionChanged() nicht bei jeder Positionsaktualisierung ausgelöst wird. Es gibt eine Verzögerung (ca. 10/15 Minuten) zwischen 2 Ausführungen des Ereignisses. Das Seltsame ist, dass dies auch passiert, wenn die App im Vordergrund ausgeführt wird (nicht nur im Hintergrund). Ich verwende den Windows Phone-Emulator.

In meiner App habe ich ein Map-Steuerelement, wo ich die Position des Benutzers zeigen muss, und so muss das geolocator_PositionChanged() -Ereignis für jede Positionsaktualisierung korrekt und ohne Verzögerungen ausgelöst werden.

1) Wie kann ich die Position des Geräts mithilfe der Geolocator-Klasse (ohne Verzögerungen) verfolgen?

Beim Durchsuchen des Netzwerks habe ich die GeoCoordinateWatcher-Klasse gefunden, die eine kontinuierliche Positionsverfolgung des Geräts ermöglicht. Dies ist der Code:

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

Es funktioniert: watcher_PositionChanged() Ereignis wird ohne Verzögerungen ausgelöst.

2) Warum hat der GeoCoordinateWatcher keine Verzögerungen? Was ist der Unterschied zwischen der GeoCoordinateWatcher-Klasse und der Geolocator-Klasse?

Schließlich sollte die App die Geräteposition an den Web-Service senden, auch wenn sie nicht aktiv ist. Also, ich brauche eine Hintergrundaufgabe. Wie von Romasz vorgeschlagen here, kann ich die Geolocator-Klasse mit einigen Einschränkungen verwenden.

3) Kann ich GeoCoordinateWhatcher im Hintergrund verwenden? Wenn ja, wie?

Mein Ziel ist es, eine Positions-Tracking-App ohne Verzögerungen zu realisieren, die sogar im Hintergrund funktioniert. Was ist der beste Weg, dies zu tun? Die App sollte die Position des Geräts verfolgen und den Web-Service kontinuierlich aktualisieren (auch im Hintergrund). Wie kann ich das machen? Was ist der beste Ansatz? Ich kenne den Windows Phone Apps-Lebenszyklus und kann einige Einschränkungen für die Hintergrundausführung akzeptieren. Was sind die Grenzen des Hintergrunds?

Antwort

11

Leider unterstützt Windows Phone 8.1 keine kontinuierliche Verfolgung im Hintergrund. Wenn Sie diese Funktion wünschen, müssen Sie stattdessen eine Windows Phone 8-App entwickeln. Hoffentlich reparieren sie das für 8.2, 9 oder was auch immer als nächstes kommt!

+0

Vielen Dank Gavin für Ihre Antwort. Bitte, können Sie genauer sein? Gibt es einige Microsoft-Dokumentation? Wenn dies in Windows Phone 8 möglich ist, wie wird es realisiert und warum wird diese Funktion von Windows Phone 8.1 entfernt? –

+0

Ich habe tatsächlich nach Links gesucht, um meine Aussage zu sichern, als ich diese Antwort gepostet habe, aber nichts Konkretes finden konnte. Ich erhielt diese Informationen auf einer Windows Phone 8.1 Kickstart-Veranstaltung, die im April 2014 von Hannes Nel veranstaltet wurde. Er stellte nützliche Folien zur Verfügung, die zeigten, wo welche APIs in den verschiedenen 8 und 8.1-Varianten von Windows Phone-Projekten verfügbar waren. Der Grund, warum ich mich so gut an diese Tatsache erinnere, ist, dass ich ein Lumia 820 für die Beantwortung einer Frage gewonnen habe, in der gefragt wurde, was nur mit Windows Phone 8 APIs und nicht mit 8.1 APIs möglich ist. Ich war enttäuscht, dass ich meine App deswegen nicht auf 8.1 upgraden kann. – Gavin

+0

Es wird hier angegeben: http://msdn.microsoft.com/en-us/library/windowsphone/develop/dn642084(v=vs.105).aspx> Kontinuierliche Hintergrundausführung wird für Silverlight 8.1 apps – Depechie

6

Es gibt eine Möglichkeit, eine Standortverfolgung zu erreichen, aber es hat seine Grenzen. Für eine Sport-App wird es nicht reichen, aber für viele andere Anwendungsfälle wird es passen. Verwenden Sie Geofence und ein BackgroundTask mit LocationTrigger

Hier ein Beispiel:

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

Dies wird ein Geofence Kreis mit dem Mittelpunkt Ihrer Position und einem Radius von 25 Meter hinzuzufügen. Wenn Sie diesen angegebenen Bereich verlassen, wird die Hintergrundaufgabe ausgelöst. Stellen Sie sicher, dass Sie den Geofence an Ihre neue Position aktualisieren, und Sie werden informiert, wenn sich der Benutzer mehr als 25 Meter bewegt.

Aber bedenken Sie, dass die BackgroundTask nicht ausgeführt werden muss, sobald Sie die Grenzen des Zauns verlassen. Es könnte eine Verzögerung von ein paar Minuten haben (ich habe nie eine Verzögerung von mehr als einer Minute bemerkt, nachdem ich den Kreis verlassen hatte). Wie gesagt: nicht genug für eine Sport-App, aber es kann Ihren Bedürfnissen entsprechen.

Weitere Informationen hier: http://msdn.microsoft.com/en-us/library/windows.devices.geolocation.geofencing.aspx

Für ein Beispielprojekt hier: https://code.msdn.microsoft.com/windowsapps/Geofencing-and-geolocation-d7ea0ef8

Bemerkungen: ich gelesen, dass es sehr zu empfehlen, um nicht mit einem Radius kleiner als 50 zu verwenden, aber In meinen Tests funktionierte 25 gut, also sollten Sie das auch selbst überprüfen.

+0

Können Sie den Beispielcode teilen, den Sie –

+0

@ThilinaAkalanka gut verwendet haben Beispielcode ist oben veröffentlicht. Was fehlt dir? – christoph

+0

ist es möglich, den Standort an azure Mobildienst innerhalb dieser Hintergrundaufgabe zu senden –

0

Ich tat genau das selbe wie @christoph ... Ich habe gerade auch das Entered-Ereignis hinzugefügt ... Meine Updates treten alle 2 Minuten auf, IMMER.

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