Xamarin.Essentials: Kompass

Mit der Klasse Compass können Sie die Ausrichtung des Geräts auf den magnetischen Norden überwachen.

Erste Schritte

Lesen Sie zum Einstieg in die Verwendung dieser API den Leitfaden mit ersten Schritte für Xamarin.Essentials, um sicherzustellen, dass die Bibliothek ordnungsgemäß installiert und in Ihren Projekten eingerichtet ist.

Verwenden des Kompasses

Fügen Sie in Ihrer Klasse einen Verweis auf Xamarin.Essentials hinzu:

using Xamarin.Essentials;

Die Kompassfunktion ruft die Methoden Start und Stop auf, um den Kompass auf Veränderungen zu überwachen. Änderungen werden über das ReadingChanged-Ereignis zurück gesendet. Im Folgenden ein Beispiel:

public class CompassTest
{
    // Set speed delay for monitoring changes.
    SensorSpeed speed = SensorSpeed.UI;

    public CompassTest()
    {
        // Register for reading changes, be sure to unsubscribe when finished
        Compass.ReadingChanged += Compass_ReadingChanged;
    }

    void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
    {
        var data = e.Reading;
        Console.WriteLine($"Reading: {data.HeadingMagneticNorth} degrees");
        // Process Heading Magnetic North
    }

    public void ToggleCompass()
    {
        try
        {
            if (Compass.IsMonitoring)
              Compass.Stop();
            else
              Compass.Start(speed);
        }
        catch (FeatureNotSupportedException fnsEx)
        {
            // Feature not supported on device
        }
        catch (Exception ex)
        {
            // Some other exception has occurred
        }
    }
}

Sensorgeschwindigkeit

  • Schnellste: Ruft die Sensordaten so schnell wie möglich ab (in einem UI-Thread ist eine Rückgabe nicht garantiert).
  • Spiel: Für Spiele geeignete Übertragungsrate (in einem UI-Thread ist eine Rückgabe nicht garantiert).
  • Standard: Für Änderungen der Bildschirmausrichtung geeignete Standardübertragungsrate.
  • UI: Für allgemeine Benutzeroberflächenaktionen geeignete Übertragungsrate.

Wenn für Ihren Ereignishandler die Ausführung im UI-Thread nicht garantiert werden kann und der Ereignishandler auf Benutzeroberflächenelemente zugreifen muss, verwenden Sie die Methode MainThread.BeginInvokeOnMainThread, um diesen Code im UI-Thread auszuführen.

Besonderheiten bei der plattformspezifischen Implementierung

Android bietet keine API zum Abrufen der Kompassausrichtung. Zum Berechnen der magnetischen Nordrichtung werden der Beschleunigungsmesser und der Magnetometer verwendet, was von Google empfohlen wird.

In seltenen Fällen werden möglicherweise inkonsistente Ergebnisse angezeigt, weil die Sensoren kalibriert werden müssen. Dafür müssen Sie u.a. mit Ihrem Gerät eine Acht formen. Am besten öffnen Sie dazu Google Maps, tippen Sie auf den Punkt für Ihren Standort, und wählen Sie Kompass kalibrieren aus.

Das gleichzeitige Ausführen mehrerer Sensoren von Ihrer App kann sich auf die Geschwindigkeit des Sensors auswirken.

Tiefpassfilter

Je nachdem, wie die Android-Kompasswerte aktualisiert und berechnet werden, müssen die Werte möglicherweise geglättet werden. Hier kann ein Tiefpassfilter angewendet werden, der aus den Sinus- und Kosinuswerten der Winkel einen Mittelwert bildet. Er wird mithilfe der Start-Methodenüberladung aktiviert, die den bool applyLowPassFilter-Parameter akzeptiert:

Compass.Start(SensorSpeed.UI, applyLowPassFilter: true);

Dies wird nur auf der Android-Plattform angewendet, und der Parameter wird auf iOS und UWP ignoriert. Weitere Informationen erhalten Sie hier.

API

Auf Channel 9 und auf YouTube finden Sie weitere Videos zu Xamarin.