Beleben von Apps mit Standort- und Sensordaten

Entwicklerblog für Windows 8-Apps

Ein Einblick in die Entwicklung von Apps im Metro-Stil – präsentiert vom Windows 8-Entwicklerteam

Beleben von Apps mit Standort- und Sensordaten

Rate This
  • Comments 0

Beim Entwickeln einer App für Windows 8-Tablets oder -Convertibles stehen Ihnen innovative Hardware- und Softwarefunktionen für Sensoren und Standortbestimmung zur Verfügung. Mithilfe dieser Funktionen können Sie Ihre Apps benutzerfreundlicher und spannender gestalten.

Stellen Sie sich eine App vor, die automatisch eine 3D-Umgebung des derzeitigen Standorts des Benutzers lädt und dann eine Navigation durch diese 3D-Welt (schwenken, kippen) anhand der Bewegung des Tablets im dreidimensionalen Raum ermöglicht. Die folgenden Bilder zeigen eine Photosynth-Panorama-App, die mithilfe von Sensorfusion natürliche Interaktionen zwischen der Ausrichtung des Geräts und dem Photosynth-Panorama der App ermöglicht. Bei Sensorfusion werden die Ausgaben eines Beschleunigungsmessers, eines Gyroskops und eines Magnetfeldmessers kombiniert und dadurch eine bessere Drehungsdarstellung im Vergleich zu Einzelmessungen der Sensoren erreicht. Sensorfusion wird durch den Windows.Devices.Sensors.OrientationSensor-Laufzeittyp verfügbar gemacht.

Hält der Benutzer das Gerät waagrecht, sieht er die Darstellung einer Geradeaussicht im Photosynth-Panorama:

Paris-Ansicht, Blickrichtung geradeaus, Copyright Felipe Garchet / 360 Cities

Kippt der Benutzer das Gerät nach oben, wird die Ansicht im Panorama ebenfalls nach oben gekippt:

Paris-Ansicht, Blickrichtung nach oben, Copyright Felipe Garchet/360 Cities

Der gleiche Interaktionstyp wird ausgeführt, wenn der Benutzer das Gerät nach links oder rechts bewegt Es entsteht der Eindruck, dass die Kamera im Panorama direkt der Ausrichtung des Tablets folgt. Wie Sie sich vorstellen können, lassen sich mit diesen Funktionen tolle Anwendungen verwirklichen, wie etwa Spiele aus der Egoperspektive, Kartenanwendungen, Fußgängernavigation und vieles mehr. Schauen wir uns jetzt die Implementierung dieses Typs an Funktionalität für Windows 8 an.

Gründe für das Verwenden von Sensoren

Bei der //build-Konferenz im Herbst 2011 wurden Informationen zur Hardwareunterstützung für Standortbestimmung und Sensoren in Windows 8 und auch Informationen zu den Windows-Runtime-APIs für Standortbestimmung und Sensoren veröffentlicht. Mit der Sensorunterstützung in Windows 8 erhalten die Benutzer systemeigene Funktionen, wie zum Beispiel automatische Bildschirmdrehung und automatische Helligkeitssteuerung. Dies sind natürlich tolle Funktionen, aber für ganz große Begeisterungsstürme werden vor allem standortbezogene und sensorgesteuerte Apps sorgen. In Windows 8 ermöglichen Standortbestimmung und Sensoren vielfältige Benutzeroberflächen, wie zum Beispiel Navigations- und Kompassszenarien, Freizeitspiele, Augmented Reality, interaktive Bewegungssteuerung für Spiele und vieles mehr.

Alle Windows 8-zertfifizierten Tablets und Convertibles verfügen über folgende Sensoren:

  • Umgebungslichtsensor (Ambient Light Sensor, ALS)
  • 9-Achsen-Sensorfusionsystem unter Verwendung der folgenden Hardware:
    • 3D-Beschleunigungsmesser
    • 3D-Gyroskop
    • 3D-Magnetfeldmesser

Zusätzlich sind alle Windows 8-Computer mit der Windows-Positionssuche (Software-Standortbestimmungsdienst) und GPS (für Computer mit mobiler Breitband-Hardware) ausgestattet.

Ihnen steht also eine beeindruckende Vielzahl an Sensor- und Standortbestimmungsfunktionen zur Verfügung. Das heißt aber auch, dass sich diese Funktionen je nach Formfaktor des Computers unterscheiden können. Sie müssen also immer beachten, für welche Hardware-Formfaktoren Ihre Apps gedacht sind.

Verwenden der Standortbestimmung in Ihrer App

Das Hinzufügen von Standortunterstützung zu einer App ist relativ einfach. Zunächst müssen Sie in der Manifestdatei der App eine Deklaration für die Standort-Funktion hinzufügen. Diese Deklaration teilt dem System mit, dass die App möglicherweise den gegenwärtigen Standort ermittelt. Natürlich entscheidet letztlich der Benutzer darüber, ob die App den gegenwärtigen Standort ermitteln darf. Sie können diese Deklaration über Visual Studio hinzufügen (doppelklicken Sie im Projektmappen-Explorer auf „package.appxmanifest“ , klicken Sie auf die Registerkarte für die Funktionen, und aktivieren anschließend in der Liste das Kontrollkästchen für Standort).

So sieht der Manifest-Editor aus der Deklaration der Standort-Funktion:

UI zur Deklaration der Standort-Funktion

 

So sieht der Ausschnitt in Ihrer package.appxmanifest.xml-Datei aus, wenn Sie die Standort-Funktion deklarieren: (in Visual Studio wird das für Sie gemacht, wenn Sie den Manifest-Editor verwenden)

<Capabilities>
<DeviceCapability Name="location" />
</Capabilities>

Nachdem Sie die Standort-Funktion in Ihrer App deklariert haben, können Sie mit der Erstellung von Code zur Abfrage der Standortdaten beginnen. Die Standort-Funktionalität ist in die Windows-Runtime-APIs integriert und kann über den Windows.Devices.Geolocation-Namespace aufgerufen werden. Sie können auch die W3C-API für Standort über JavaScript verwenden. In diesem Beitrag wird die Windows-spezifische Variante erklärt. Weitere Einzelheiten über die Verwendung der W3C-API für den Standort finden Sie unter Schnellstart: Positionserkennung mit HTML5 (Apps im Metro-Stil mit JavaScript und HTML).

Es gibt zwei grundlegende Arten des Zugriffs auf Standortdaten: die einmalige Standortabfrage oder ein Datenstrom von Ereignissen, die jedes Mal erzeugt werden, wenn das System eine Veränderung des Standorts erkennt. Werfen wir je einen kurzen Blick auf die beiden Zugriffsmodelle, damit Sie entscheiden können, welches Modell besser zu Ihrer App passt.

Einmalige Standortabfrage

Soll der Standort immer nur auf Nachfrage ermittelt werden, zum Beispiel um Sehenswürdigkeiten in der Umgebung des Benutzers zu finden, Inhalte mit Standortangaben zu versehen, die Position des Benutzers auf einer Karte anzuzeigen usw., können Sie das mit einigen wenigen Codezeilen festlegen. Dadurch sparen Sie wertvolle Akkulaufzeit. Betrachten wir einen Codeausschnitt, der die einmalige Standortabfrage demonstriert.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.positionAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.getGeopositionAsync().done(getPositionHandler, errorHandler);

function getPositionHandler(pos) {
var lat = pos.coordinate.latitude;
var long = pos.coordinate.longitude;
var acc = pos.coordinate.accuracy;
}

function errorHandler(err) {
// handle error
}

C#:

using Windows.Devices.Geolocation;

var loc = new Geolocator();

try
{
loc.DesiredAccuracy = PositionAccuracy.High;
Geoposition pos = await loc.GetGeopositionAsync();

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}
catch (System.UnauthorizedAccessException)
{
// handle error
}

Hier wird Folgendes gezeigt:

  • Erstellen eines Geolocator-Objekts (Stammobjekt für Standort)
  • Asynchroner Aufruf eines Vorgangs zum Abruf des gegenwärtigen Standorts mit Fehlerbehandlung, wenn Standortabfrage verweigert wird.

Beachten Sie, dass Sie einen in Verarbeitung befindlichen Aufruf von GetGeopositionAsync bei Bedarf abbrechen können. Im Windows Runtime Geolocation SDK sample finden Sie Beispielcode, der dies veranschaulicht. Weitere Informationen zur einmaligen Standortabfrage finden Sie in der Beschreibung der Geolocator.GetGeopositionAsync() | getGeopositionAsync()-Methode und im Geolocation-SDK-Beispiel.

Fortlaufende Standortabfrage

Wenn Ihre App eine fortlaufende Abfrage von Standortdaten benötigt, zum Beispiel für Turn-by-Turn-Navigation, Benachrichtigungen des Benutzers beim Erreichen interessanter Wegmarken, Streckenprotokolle usw., sollten Sie einen Ereignislistener hinzufügen, den die App aufruft, wenn einer oder mehrere der Positionssuchen für das System eine Standortveränderung melden. So können Sie Standortveränderungen verfolgen.

JavaScript:

var loc = new Windows.Devices.Geolocation.Geolocator();
loc.desiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.high;
loc.addEventListener("positionchanged", onPositionChanged);

function onPositionChanged(e) {
var lat = e.position.coordinate.latitude;
var long = e.position.coordinate.longitude;
var acc = e.position.accuracy;
}

C#:

using Windows.Devices.Geolocation;

private Geolocator loc = new Geolocator();

private void StartTracking(object sender, RoutedEventArgs e)
{
loc.DesiredAccuracy = PositionAccuracy.High;
loc.PositionChanged += new TypedEventHandler<Geolocator, PositionChangedEventArgs>(OnPositionChanged);
}

private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
Geoposition pos = e.Position;

var lat = pos.Coordinate.Latitude;
var long = pos.Coordinate.Longitude;
var acc = pos.Coordinate.Accuracy;
}

Dies ist praktisch der gleiche Code, wie bei der einmaligen Standortsuche; statt einen asynchronen Vorgang auszuführen, wird jedoch ein Ereignislistener hinzugefügt, der einen Delegaten übergibt, um das Ereignis zu behandeln. Sobald eine Standortänderung erkannt wird, wird der Delegat aufgerufen, und es können alle Standortdaten verwendet werden, die unsere App von dieser Methode benötigt. Wenn Sie die Empfindlichkeit der Reaktion des Elements auf Bewegungen anpassen möchten, können Sie die MovementThreshold-Eigenschaft für das Geolocator-Objekt festlegen.

Ein weiterer Aspekt hinsichtlich der Feinabstimmung des Verhaltens der Standort-API ist die Möglichkeit, die DesiredAccuracy-Eigenschaft für das Geolocator-Objekt festzulegen. Wenn Ihre App keine GPS-Genauigkeit benötigt (z. B. eine Wetter-App), können Sie diese Eigenschaft auf „Standard“ festlegen und so die Verwendung von GPS zur Standortbestimmung einschränken. So kann die Akkulaufzeit verlängert werden.

Informationen, wie Sie die Verwendung von Standortinformationen zu Ihrer App hinzufügen, erhalten Sie im Geolocation-Beispiel, in den Richtlinien für standortabhängige Anwendungen und in den Dokumenten des Windows.Devices.Geolocation-Namespace auf MSDN.

Sensoren

Windows 8 bietet zahlreiche und leicht zu verwendende APIs für Sensoren. Diese Klassen befinden sich im Windows.Devices.Sensors-Namespace und stellen die entsprechende zugrundeliegende Sensorhardware dar:

Erinnern Sie sich an das interaktive Photosynth-Panorama, das zuvor angesprochen wurde? Diese Interaktionstypen können mithilfe von Sensorfusion über die Windows-Runtime-APIs implementiert werden. Da Geräteausrichtung und Kamera (oder der Aussichtspunkt im Photosynth-Panorama) reaktionsschnell und nahtlos miteinander interagieren sollen, muss Sensorfusion über die Windows.Devices.Sensors.OrientationSensor-Klasse verwendet werden. Weitere Informationen zur Technologie, die dem Einsatz von Sensorfusion zugrunde liegt, erhalten Sie in der Sensorunterstützung für Windows 8. Die OrientationSensor-Klasse stellt als leistungsstarke Darstellung der Geräteausrichtung zwei Datenfelder bereit: der Vektor mit vier Elementen wird als Quaternion bezeichnet, eine 3x3-Wertematrix als Drehmatrix. Diese Datenfelder stellen die gleichen Daten dar, die Paketierung der Daten erfolgt jedoch in unterschiedlichen Formaten.

Details zur Supportimplementierung für Schwenks und Neigungen über Quaternion- oder Drehmatrixdaten (Transformationen usw.) sprengen den Rahmen dieses Blogbeitrags, allerdings soll der Zugriff auf diese Daten mithilfe der Windows-Runtime-API erläutert werden.

Alle Sensorobjekte in der Windows-Runtime-API für Sensoren sind ähnlich gestaltet. Zunächst wird das Sensorobjekt erstellt. Als Nächstes erfolgt die Initialisierung, die Voreinstellungen werden angewendet (z. B. indem das gewünschten Berichtsintervall festgelegt wird) und anschließend wird entweder per asynchronem Aufruf oder durch Hinzufügen eines Ereignislisteners auf die Daten zugegriffen.

So können Sie asynchron auf die Daten zugreifen:

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

C#:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
// Select a report interval that works for the app and that the sensor supports.
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;

// Set the report interval to enable the sensor for polling
sensor.reportInterval = reportInterval;

var reading = sensor.getCurrentReading();
if (reading) {
var quaternion = reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}
}

Diese Art von Zugriff ist möglicherweise vorzuziehen, wenn die Daten nur unter bestimmten Bedingungen (z. B. beim Festlegen der Geräteausrichtung für ein Objekt als Reaktion auf eine Benutzeraktion) benötigt werden oder wenn die Daten über einen Timer (z. B. eine Renderingschleife in einem Spiel) abgefragt werden. Selbst wenn Sie die Daten nur abrufen, sollten Sie das Berichtsintervall wie hier gezeigt festlegen. So kann die Daten von der Hardware/dem Treiber für die Sensoren mit der Häufigkeit abgerufen werden, die von der App benötigt wird.

Nun sollen Reaktionen beim Lesen von geänderten Ereignissen behandelt werden.

JavaScript:

var sensor = Windows.Devices.Sensors.OrientationSensor.getDefault();
if (sensor) {
var minimumReportInterval = sensor.minimumReportInterval;
var reportInterval = minimumReportInterval > 20 ? minimumReportInterval : 20;
sensor.reportInterval = reportInterval;

sensor.addEventListener("readingchanged", onDataChanged);
}

function onDataChanged(e) {
var quaternion = e.reading.quaternion;
var x = quaternion.x;
var y = quaternion.y;
var z = quaternion.z;
var w = quaternion.w;
}

C#:

using Windows.Devices.Sensors;

private OrientationSensor sensor = OrientationSensor.GetDefault();

private void EnableReadings(object sender, RoutedEventArgs e)
{
if (sensor != null)
{
var minReportInterval = sensor.MinimumReportInterval;
var desiredReportInterval = minReportInterval > 20 ? minReportInterval : 20;

sensor.ReportInterval = desiredReportInterval;

sensor.ReadingChanged += new TypedEventHandler<OrientationSensor, OrientationSensorReadingChangedEventArgs>(ReadingChanged);
}
}

private void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
{
SensorQuaternion quaternion = e.Reading.Quaternion;
var x = quaternion.X;
var y = quaternion.Y;
var z = quaternion.Z;
var w = quaternion.W;
}

In diesem Codeausschnitt rufen wir ein OrientationSensor-Objekt ab und legen dann das Berichtsintervall entweder auf „20“ oder den kleinsten unterstützten Wert (die höchste Rate, mit der die Sensorhardware Daten bereitstellen kann) fest – je nachdem, welcher Wert größer ist. So werden Daten für diese App in einem Abstand abgerufen, der – in diesem Beispiel – so nah wie möglich an 20 Millisekunden liegt. Verwenden Sie ein geeignetes Intervall für Ihre App (jedoch nur so schnell, wie die Daten benötigt werden), damit Energieverbrauch und Leistung nicht negativ beeinflusst werden.

Im Ereignislistener-Delegat werden die geeigneten Transformationen mithilfe der Quaternion-Daten [x,y,z,w] angewendet, um Bewegungs- bzw. Ausrichtungsinteraktionen in der App zu ermöglichen. Analog sind ebenfalls die Drehmatrixdaten verfügbar. Dieser Transformationscode geht über das Thema dieses Blogs hinaus, allerdings sind verschiedene Onlinequellen zur Verwendung von Quaternion-Daten in Spieleszenarien, Robotik u. a. verfügbar. Der Vorteil von Quaternion- oder Drehmatrixdaten gegenüber Neigungsmesserdaten liegt in der Kontinuität der Drehungsdaten, so wird die „Kardansperre“ (Gimbal Lock) vermieden, die bei eulerschen Winkelberechnungen auftreten kann.

Fazit

Wenn Sie Funktionalität für Sensor und Standortbestimmung in Ihre App einbinden, können Sie neue und spannende Verwendungsmöglichkeiten für die Benutzer umsetzen. Windows 8 bietet Zugriff auf umfassende Hardware- und Softwareunterstützung, auf Visual Studio, auf einfach zu verwendende Windows-Runtime-APIs und auf verschiedene Programmiersprachen, aus denen Sie für Apps mit Sensor- und Standortunterstützung auswählen können. So können diese Funktionen besser und einfacher in Ihre Apps implementiert werden. Probieren Sie es einfach aus!

– Gavin Gear, Programmmanager

– Dino Natucci, Programmmanager

  • Loading...
Leave a Comment
  • Please add 6 and 8 and type the answer here:
  • Post