Sensors API ist eine Android-Plattformschnittstelle für den Zugriff auf Hardware-Sensoren des Geräts. Die API bietet eine einheitliche Methode zum Abrufen von Daten vom Beschleunigungsmesser, Gyroskop, Magnetometer, Lichtsensor und anderen Sensoren. Laut Google, 2026 sind mehr als 95% der modernen Android-Geräte mit mindestens drei Sensortypen ausgestattet, was breite Möglichkeiten für die Entwicklung kontextbewusster Anwendungen eröffnet.
Wichtige Erkenntnisse
Sensors API ist eine Softwareschnittstelle des Android-Frameworks, die Entwicklern Zugriff auf die Hardware-Sensoren des mobilen Geräts bietet. Die API ist seit Version 1.0 Teil des Android SDK und über das Paket android.hardware verfügbar. Die Schnittstelle abstrahiert Unterschiede zwischen Sensorimplementierungen verschiedener Hersteller — Qualcomm, MediaTek, Samsung Exynos — und bietet ein einheitliches Modell für die Arbeit mit Sensoren.
Die API ermöglicht drei Hauptoperationen: Abrufen der Liste verfügbarer Sensoren, Registrieren von Listenern zum Empfangen von Daten und Verwalten der Aktualisierungsrate. SensorManager fungiert als zentraler Zugangspunkt für alle Operationen. Das System benachrichtigt die Anwendung über den Callback onSensorChanged und übergibt ein SensorEvent-Objekt mit einem Array von Float-Werten.
Im Laufe der Android-Entwicklung durchlief die API mehrere Entwicklungsstufen. Version 2.3 (Gingerbread) führte die Batch-Verarbeitung ein — die Gruppierung von Sensorereignissen zur Reduzierung des Stromverbrauchs. Android 4.0 (Ice Cream Sandwich) fügte die virtuellen Sensoren Gravity und Linear Acceleration hinzu. Ab Android 8.0 schränkte das System den Hintergrundzugriff auf Sensoren zur Verbesserung der Privatsphäre ein.
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensorList: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
sensorList.forEach { sensor ->
Log.d("Sensoren", "${sensor.name} — ${sensor.type}")
}
Nicht alle Geräte haben denselben Sensorsatz. Eine Anwendung muss die Verfügbarkeit eines bestimmten Sensors vor der Registrierung eines Listeners überprüfen. Der Android-Emulator unterstützt nur einen begrenzten Sensorsatz — Beschleunigungsmesser und Magnetometer. Das Testen anderer Sensoren erfordert ein physisches Gerät. Ab Android 12 müssen Anwendungen die Sensorverwendung im Manifest deklarieren.
Android klassifiziert alle Sensoren in drei Kategorien: Motion, Position und Environment. Motion-Sensoren umfassen Beschleunigungsmesser, Gyroskop und Schrittzähler. Position-Sensoren umfassen Magnetometer und Orientierung. Environment-Sensoren umfassen Licht, Druck, Temperatur und Luftfeuchtigkeit.
| Kategorie | Sensoren | Typ (Konstante) | Physisch/Virtuell |
|---|---|---|---|
| Motion | Beschleunigungsmesser | TYPE_ACCELEROMETER | Physisch |
| Motion | Gyroskop | TYPE_GYROSCOPE | Physisch |
| Motion | Schrittzähler | TYPE_STEP_COUNTER | Physisch |
| Motion | Gravity | TYPE_GRAVITY | Virtuell |
| Position | Magnetometer | TYPE_MAGNETIC_FIELD | Physisch |
| Position | Rotation Vector | TYPE_ROTATION_VECTOR | Virtuell |
| Environment | Licht | TYPE_LIGHT | Physisch |
| Environment | Druck | TYPE_PRESSURE | Physisch |
Der Beschleunigungsmesser misst die Beschleunigung in m/s² entlang dreier Achsen — X, Y und Z. Die Werte umfassen die Schwerkraft (9,8 m/s² entlang der Z-Achse im Ruhezustand). Das Gyroskop misst die Winkelgeschwindigkeit in rad/s — die Rotationsgeschwindigkeit des Geräts um jede Achse. Die Kombination dieser beiden Sensoren wird in Navigation, Spielen und AR-Anwendungen verwendet.
class SensorActivity : Activity(), SensorEventListener {
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_ACCELEROMETER) {
val x = event.values[0]
val y = event.values[1]
val z = event.values[2]
textView.text = "X: $x, Y: $y, Z: $z"
}
}
override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) {}
}
Das Magnetometer (TYPE_MAGNETIC_FIELD) misst das Magnetfeld in Mikrotesla (µT) entlang dreier Achsen. Es wird als digitaler Kompass verwendet — in Kombination mit dem Beschleunigungsmesser bestimmt es den Azimut des Geräts. Rotation Vector ist ein virtueller Sensor, der Daten von Gyroskop, Beschleunigungsmesser und Magnetometer zur präzisen Orientierungsbestimmung fusioniert.
Der Lichtsensor (TYPE_LIGHT) misst die Umgebungslichtstärke in Lux (lx). Er wird zur automatischen Bildschirmhelligkeitsanpassung verwendet. Der Drucksensor (TYPE_PRESSURE) misst den atmosphärischen Druck in Hektopascal (hPa) — er wird in Navigationsanwendungen zur Bestimmung der Höhe über dem Meeresspiegel verwendet.
Sensors API basiert auf einer Client-Server-Architektur. Die Anwendung fungiert als Client, SensorManager als Android-Systemdienst. Wenn die Anwendung einen Listener über registerListener registriert, kommuniziert SensorManager mit der HAL (Hardware Abstraction Layer) — einem Low-Level-Sensortreiber auf Linux-Kernel-Ebene.
Der HAL-Treiber empfängt Rohdaten vom Hardware-Chip, filtert Rauschen und leitet sie den Stack hinauf — über den SensorService (Systemprozess) zur Anwendung. Die Daten werden als SensorEvent-Objekt übergeben, das ein Array von Float-Werten values und einen Zeitstempel in Nanosekunden enthält. Die Ereignisrate hängt vom gewählten Zustellmodus ab.
Bei der Listener-Registrierung gibt der Entwickler die gewünschte Verzögerung zwischen Ereignissen mithilfe der Konstanten SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) und SENSOR_DELAY_FASTEST (0 ms — maximale Rate) an. Die tatsächliche Rate kann abweichen — das System optimiert den Stromverbrauch.
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
this,
sensor,
SensorManager.SENSOR_DELAY_GAME
)
Ab Android 2.3 unterstützen Sensoren den Batch-Modus — Ereignisse werden in einem FIFO-Puffer gesammelt und in einem Batch zugestellt. Dies ermöglicht es dem Prozessor, länger im Schlafmodus zu bleiben, wodurch der Stromverbrauch um bis zu 60% gesenkt wird. Die Puffergröße hängt vom Sensor-Chip ab und wird im Feld Sensor.fifoMaxEventCount angegeben.
SensorManager ist ein Systemdienst, der über getSystemService(Context.SENSOR_SERVICE) verfügbar ist. Er bietet Methoden zum Abrufen einer Sensorliste, zum Abrufen eines bestimmten Standardsensors und zum Registrieren/Abmelden von Listenern. SensorManager ist ein Singleton — eine Instanz für die gesamte Anwendung.
Vor der Verwendung eines Sensors müssen Sie seine Verfügbarkeit überprüfen. Die Methode getDefaultSensor(type) gibt null zurück, wenn der Sensor auf dem Gerät nicht vorhanden ist. Null erhalten ohne Überprüfung führt bei der Listener-Registrierung zu einer NullPointerException. Die Methode getSensorList(type) gibt eine Liste aller Sensoren zurück.
fun checkSensorAvailability(type: Int): Boolean {
val sensorManager =
getSystemService(Context.SENSOR_SERVICE) as SensorManager
return sensorManager.getDefaultSensor(type) != null
}
// Verwendung:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
Log.d("Sensor", "Gyroskop verfügbar")
}
Ein Listener wird über registerListener(listener, sensor, delay) registriert. Wichtig: Sie müssen den Listener in der onPause()-Methode über unregisterListener(listener) abmelden. Andernfalls empfängt die Anwendung weiterhin Sensorereignisse und entlädt den Akku auch im Hintergrund. Android 8+ zeigt eine Warnung in logcat über nicht abgemeldete Listener an.
Die Methode onAccuracyChanged(sensor, accuracy) wird aufgerufen, wenn sich die Genauigkeit des Sensors ändert. Werte: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW und UNRELIABLE. Bei UNRELIABLE sollten Sensordaten ignoriert werden, bis die Genauigkeit wiederhergestellt ist. Beispielsweise benötigt das Magnetometer eine Kalibrierung — das Gerät in einer Acht bewegen.
Sehen wir uns praktische Beispiele zur Verwendung der Sensors API in Android-Anwendungen mit Kotlin an. Das erste Beispiel — Bestimmen der Bildschirmorientierung mit dem Beschleunigungsmesser. Das zweite — Auslesen von Magnetometerdaten mit Kalibrierung. Das dritte — ein Schrittdetektor mit dem Schrittzähler.
Eine Kombination aus Beschleunigungsmesser und Magnetometer wird zur Bestimmung der Orientierung verwendet. Die Methode SensorManager.getRotationMatrix() berechnet die Rotationsmatrix, und getOrientation() extrahiert die Winkel Pitch, Roll und Azimut. Azimut — der Winkel relativ zum magnetischen Norden in Radiant.
val gravity = FloatArray(3)
val geomagnetic = FloatArray(3)
val rotationMatrix = FloatArray(9)
val orientation = FloatArray(3)
SensorManager.getRotationMatrix(
rotationMatrix, null, gravity, geomagnetic
)
SensorManager.getOrientation(rotationMatrix, orientation)
// orientation[0] — azimuth, [1] — pitch, [2] — roll
val azimuthDeg = Math.toDegrees(orientation[0].toDouble())
Der Schrittzähler (TYPE_STEP_COUNTER) gibt die Gesamtzahl der Schritte zurück, die der Benutzer seit dem letzten Geräteneustart zurückgelegt hat. Der Sensor arbeitet auf Hardware-Ebene — er ist aktiv, auch wenn die Anwendung nicht ausgeführt wird. Um Schritte pro Sitzung zu erhalten, müssen Sie den Anfangswert speichern und die Differenz berechnen.
var initialSteps = 0
var isInitialized = false
override fun onSensorChanged(event: SensorEvent) {
if (event.sensor.type == Sensor.TYPE_STEP_COUNTER) {
if (!isInitialized) {
initialSteps = event.values[0].toInt()
isInitialized = true
}
val currentSteps = event.values[0].toInt()
val sessionSteps = currentSteps - initialSteps
Log.d("Schritte", "Schritte pro Sitzung: $sessionSteps")
}
}
Der Lichtsensor ermöglicht die Anpassung der Benutzeroberfläche an die Umgebungsbedingungen. Bei schwachem Licht (weniger als 10 lx) können Sie in den Dunkelmodus wechseln. Bei hellem Sonnenlicht (mehr als 10000 lx) können Sie den Kontrast erhöhen. Zur Rauschfilterung wird ein gleitender Durchschnitt der letzten 5 Werte verwendet.
Android bietet mehrere virtuelle Sensoren, die kein direktes Hardware-Äquivalent haben. Ein virtueller Sensor berechnet seine Messwerte basierend auf einer Kombination physischer Sensoren. Dies entlastet den Entwickler — das System selbst implementiert Datenfusionsalgorithmen.
Der Gravity-Sensor (TYPE_GRAVITY) extrahiert die Gravitationskomponente aus Beschleunigungsmesserwerten mithilfe eines Tiefpassfilters. Linear Acceleration (TYPE_LINEAR_ACCELERATION) entfernt dagegen die Schwerkraft und lässt nur die lineare Beschleunigung des Geräts übrig. Die Summe von Gravity und Linear Acceleration ergibt die Rohwerte des Beschleunigungsmessers.
Rotation Vector — der komplexeste virtuelle Sensor. Er kombiniert Daten vom Gyroskop (hochfrequente Änderungen), Beschleunigungsmesser (Gravitationsvektor) und Magnetometer (Orientierung relativ zum Norden). Das Ergebnis ist ein Quaternion, das die absolute Ausrichtung des Geräts im Raum beschreibt. Es wird in AR-Anwendungen und VR-Headsets verwendet.
Game Rotation Vector — eine vereinfachte Version des Rotation Vector ohne Verwendung des Magnetometers. Dies ergibt eine geringere Azimutgenauigkeit, aber eine höhere Aktualisierungsrate und Stabilität. Empfohlen für Spiele, bei denen niedrige Latenz wichtiger ist als die absolute Ausrichtung relativ zum Norden.
Sensoren gehören zu den stromhungrigsten Komponenten des Geräts. Beschleunigungsmesser und Gyroskop können bei maximaler Abtastrate den Akku in 3–4 Stunden Dauerbetrieb entladen. Die Optimierung der Sensorverwendung ist eine kritische Aufgabe für jede Anwendung, die die Sensors API verwendet.
Verwenden Sie SENSOR_DELAY_FASTEST nicht unnötig. Für UI-Animationen ist SENSOR_DELAY_UI (60 ms) ausreichend. Für die Bildschirmorientierungserkennung — SENSOR_DELAY_NORMAL (200 ms). Je höher die Rate, desto mehr Zeit verbringt der Prozessor im aktiven Zustand. Der Unterschied zwischen NORMAL und FASTEST beträgt bis zu 10x beim Stromverbrauch.
Ab Android 8.0 (API 26) erhalten Hintergrundanwendungen Sensorereignisse mit reduzierter Rate. Unter Android 12+ erfordert der Hintergrundzugriff auf Motion- und Position-Sensoren die Berechtigung BODY_SENSORS_BACKGROUND. Melden Sie den Listener ab, wenn die Anwendung in den Hintergrund wechselt — dies verlängert die Akkulaufzeit des Geräts.
Verwenden Sie die Batch-Verarbeitung über die Methode registerListener(listener, sensor, delay, maxReportLatencyUs). Der Parameter maxReportLatencyUs legt die maximale Ereigniszustellungsverzögerung in Mikrosekunden fest. Bei einem Wert von 1000000 (1 Sekunde) sammeln sich Ereignisse im FIFO-Puffer des Sensors und werden einmal pro Sekunde zugestellt — der Prozessor wacht seltener auf.
Häufig gestellte Fragen
Die Mindestausstattung ist ein Beschleunigungsmesser und ein Magnetometer. Diese beiden Sensoren sind auf mehr als 95% der Geräte vorhanden. Gyroskop, Lichtsensor und Näherungssensor — auf 70–80% der modernen Modelle. Andere Sensoren (Druck, Temperatur, Luftfeuchtigkeit, Schrittzähler) sind weniger verbreitet und hängen von der Preisklasse des Geräts ab.
TYPE_ACCELEROMETER gibt die Gesamtbeschleunigung einschließlich der Schwerkraft (9,8 m/s²) zurück. TYPE_LINEAR_ACCELERATION gibt die Beschleunigung ohne Schwerkraft zurück — nur die Bewegungsbeschleunigung des Geräts. Wenn das Gerät still liegt, zeigt der Beschleunigungsmesser 9,8 m/s² entlang der Z-Achse, während Linear Acceleration auf allen Achsen 0 anzeigt.
Verwenden Sie getPackageManager().hasSystemFeature() mit den entsprechenden Konstanten: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY und andere. Eine alternative Methode ist der Aufruf von getDefaultSensor(type) und die Überprüfung des Ergebnisses auf null. Die erste Methode ist für die Überprüfung während der Initialisierung vorzuziehen.
Rohdaten von Sensoren enthalten Rauschen. Zum Glätten verwenden Sie einen Tiefpassfilter: newValue = alpha * rawValue + (1 — alpha) * previousValue. Ein Alpha-Koeffizient von 0,1–0,3 bietet eine gute Balance zwischen Reaktionsfähigkeit und Glätte. Für das Gyroskop wird auch ein Hochpassfilter zur Entfernung der Nullpunktdrift angewendet.
Ja, aber mit Einschränkungen. Ab Android 8.0 wird die Sensorereignisrate für Hintergrundanwendungen reduziert. Ab Android 12 ist die Berechtigung BODY_SENSORS_BACKGROUND für den Hintergrundzugriff auf Sensoren erforderlich. Für Hintergrundarbeit wird die Verwendung eines Foreground Service mit einer Benachrichtigung empfohlen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch