© StonePictures/Shutterstock.com
Teil 3: Weitere Sensoren unter der Lupe

Umgebungssensoren


Dank moderner APIs ist die Nutzung der Sensoren in modernen Smartphones einfach. Sie können die Werte der Sensoren in eigenen Apps verwenden und daraus spannende Anwendungen konzipieren. In vielen Fällen bekommt man beide Plattformen mit einem Quellcode unter einen Hut. Auch mit Web-APIs ist schon vieles möglich.

Nach einem allgemeinen Überblick in Teil 1 der Serie und den typischen Sensoren eines Smartphones bzw. Tablets sowie der Anwendung bzw. Programmierung der Geolocation-Funktion in Teil 2, geht es in dieser Folge um die Programmierung der weiteren Sensoren eines Smartphones. Welche Sensoren tatsächlich vorhanden sind, ist von Gerät zu Gerät unterschiedlich. Dennoch lässt sich vieles verallgemeinern. Wir haben schon eine Reihe dieser Sensoren kennengelernt und wollen nun schauen, wie wir an die Daten dieser kleinen Umweltfühler kommen. Programmierbeispiele in Java für Android, Swift für iOS und Xamarin für beide Systeme zeigen die grundsätzliche Vorgehensweise. Ein weiterer Abschnitt thematisiert die Möglichkeiten webbasierter APIs.

Sensoren mit Android in Java

Mit dem Sensor-Framework von Android können Sie auf viele Arten von Sensoren zugreifen. Einige dieser Sensoren sind hardware-, einige softwarebasiert. Hardwarebasierte Sensoren sind physische Komponenten. Sie erhalten ihre Daten, indem sie die Werte für Beschleunigung, Geomagnetfeldstärke usw. direkt messen. Softwarebasierte Sensoren leiten ihre Daten von einem oder mehreren hardwarebasierten Sensoren ab und werden manchmal als virtuelle Sensoren oder synthetische Sensoren bezeichnet. Der lineare Beschleunigungssensor und der Schwerkraftsensor sind Beispiele für softwarebasierte Sensoren. Eine Übersicht über die Sensoren, die auf der Android-Plattform unterstützt werden, findet sich unter [1]. Ein Blick auf den unteren Bereich dieser Webseite zeigt, dass die Sensoren bereits seit vielen Android-Versionen, die meisten davon schon seit Android 1.5 (API-Level 3), unterstützt werden. Wir können also heute davon ausgehen, dass wir softwaretechnisch unter Android stets eine Unterstützung für die aktuellen und am meisten verwendeten Sensoren zur Verfügung haben. Arbeiten wir direkt mit Android, zum Beispiel mit der Programmiersprache Java, dann findet sich das Sensor-Framework im Package android.hardware. Nutzen wir die plattformübergreifende Programmierung, dann werden die APIs über eine Komponente gekapselt, da sie dann mit der Hardware von iOS synchronisiert werden müssen. Die relevanten Klassen im Package android.hardware sind:

  • SensorManager: Damit erstellen Sie eine Instanz des Sensordienstes. Die Klasse bietet verschiedene Methoden zum Zugreifen und Auflisten von Sensoren, zum Registrieren und Aufheben der Registrierung von Sensorereignis-Listenern und zum Abrufen von Orientierungsinformationen. Diese Klasse bietet auch mehrere Sensorkonstanten, die verwendet werden, um die Sensorgenauigkeit zu melden bzw. zu definieren, Datenerfassungsraten festzulegen und die Sensoren zu kalibrieren, sofern das möglich ist.

  • Sensor: Damit wird eine konkrete Instanz eines bestimmten Sensors erstellt.

  • SensorEvent: Diese Klasse wird verwendet, um ein Sensorereignisobjekt zu erstellen, das Informationen zu einem Sensorereignis bereitstellt. Ein Sensorereignisobjekt enthält die folgenden Informationen: die Rohsensordaten, den Sensortyp, der das Ereignis generiert hat, die Genauigkeit der Daten und den Zeitstempel des Ereignisses.

  • SensorEventListener: Sie können diese Schnittstelle verwenden, um Rückrufmethoden zu erstellen, die Benachrichtigungen (Sensorereignisse) empfangen, wenn sich sensorische Werte ändern oder sich die Sensorgenauigkeit ändert.

In Android (Java) arbeitet man mit einem Sensor wie folgt:

  1. Identifizieren von Sensoren und Sensorfunktionen: Dazu definieren Sie eine private Variable des Typs SensorManager und rufen eine Liste der verfügbaren Sensoren ab:

    private SensorManager sensorManager; sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);

Das Ergebnis ist eine Auflistung der verfügbaren Sensoren, sie werden als Objekte der Klasse Sensor ermittelt: TYPE_GYROSCOPE, TYPE_LINEAR_ACCELERATION oder TYPE_GRAVITY.

  1. Prüfen, ob ein bestimmter Sensor auf dem Gerät vorhanden ist: Das erledigt man über die Methode getDefaultSensor(…). Als Parameter übergeben Sie eine Typkonstante für einen bestimmten Sensor, also zum Beispiel getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD). Wenn ein Gerät über mehr als einen Sensor eines bestimmten Typs verfügt, muss einer der Sensoren als Standardsensor bezeichnet werden. Wenn für einen bestimmten Sensortyp kein Standardsensor vorhanden ist, gibt der Methodenaufruf den Wert NULL zurück, d. h., das Gerät verfügt nicht über diesen Sensortyp. Wir schreiben also:

    private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There’s a magnetometer. } else { // Failure! No magnetometer. }
  2. Abrufen von Sensoreigenschaften: Sie können mehr über die Eigenschaften eines einzelnen Sensors erfahren. Sie können beispielsweise die Methoden getResolution(…) und getMaximumRange(…) verwenden, um die Auflösung und den maximalen Messumfang eines Sensors zu erhalten. Sie können auch die getPower(…)-Methode verwenden, um den Leistungsbedarf eines Sensors zu ermitteln. Des Weiteren kann man auch den Hersteller (Methode getVendor(…)) und die Version (getVersion(…)) eines Sensors erfragen. Das kann sinnvoll sein, wenn eine Software zum Beispiel das Vorhandensein eines bestimmten Sensors voraussetzt und ggf. nur mit einer bestimmten Version dieses Sensortyps funktioniert. Eine weitere nützliche Methode ist getMinDelay(…), die das minimale Zeitintervall (in Mikrosekunden) zurückgibt, das ein Sensor zum Erfassen von Daten verwenden kann. Jeder Sensor, der für die Methode getMinDelay(…) einen Wert ungleich Null zurückgibt, ist ein Streamingsensor. Streamingsensoren erfassen Daten in regelmäßi...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang