Sensors API: Was es ist, Sensortypen und Arbeit mit Sensoren

Autor: IT Sectr Veröffentlicht: 2026-03-26 Lesezeit: 10 Min.

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 — eine einheitliche Android-Schnittstelle für die Arbeit mit Hardware-Sensoren des Geräts.
  • Drei Kategorien — Motion-, Position- und Environment-Sensoren mit unterschiedlichen Messprinzipien.
  • SensorManager — ein Systemdienst zum Abrufen der Sensorliste und Registrieren von Listenern.
  • Aktualisierungsrate wird über SENSOR_DELAY-Konstanten von NORMAL bis FASTEST festgelegt.
  • Virtuelle Sensoren — Gravity, Rotation Vector und Linear Acceleration basieren auf einer Kombination physischer Sensoren.

Was ist Sensors API in Android?

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.

Hauptfunktionen der Sensors API

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.

Entwicklung der Sensors API

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.

kotlin
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}")
}

Einschränkungen und Anforderungen

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-Sensortypen: Motion, Position, Environment

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.

KategorieSensorenTyp (Konstante)Physisch/Virtuell
MotionBeschleunigungsmesserTYPE_ACCELEROMETERPhysisch
MotionGyroskopTYPE_GYROSCOPEPhysisch
MotionSchrittzählerTYPE_STEP_COUNTERPhysisch
MotionGravityTYPE_GRAVITYVirtuell
PositionMagnetometerTYPE_MAGNETIC_FIELDPhysisch
PositionRotation VectorTYPE_ROTATION_VECTORVirtuell
EnvironmentLichtTYPE_LIGHTPhysisch
EnvironmentDruckTYPE_PRESSUREPhysisch

Motion-Sensoren: Beschleunigungsmesser und Gyroskop

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.

kotlin
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) {}
}

Position-Sensoren: Magnetometer und Orientierung

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.

Environment-Sensoren: Licht, Druck, Temperatur

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.

Wie die Sensors API-Architektur funktioniert

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.

Lebenszyklus eines Sensorereignisses

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.

Ereigniszustellungsmodi

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.

kotlin
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
    this,
    sensor,
    SensorManager.SENSOR_DELAY_GAME
)

Batch-Verarbeitung

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.

Verwendung von SensorManager für den Sensorzugriff

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.

Überprüfung der Sensorverfügbarkeit

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.

kotlin
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")
}

Listener registrieren und abmelden

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.

Behandlung von Genauigkeitsänderungen

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.

Codebeispiele für die Arbeit mit Sensoren in Kotlin

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.

Bestimmen der Geräteorientierung

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.

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

Schrittdetektor mit Schrittzähler

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.

kotlin
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")
    }
}

Adaptive Helligkeit mit Lichtsensor

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.

Virtuelle Sensoren und Fusionsalgorithmen

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.

Gravity und Linear Acceleration

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

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

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.

Batterieoptimierung bei der Arbeit mit Sensoren

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.

Die optimale Verzögerung wählen

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.

Listener im Hintergrund abmelden

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.

Batch-Verarbeitung und FIFO-Puffer

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

Welche Sensoren sind auf allen Android-Geräten vorhanden?

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.

Was ist der Unterschied zwischen TYPE_ACCELEROMETER und TYPE_LINEAR_ACCELERATION?

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.

Wie überprüfe ich, ob der benötigte Sensor auf dem Gerät verfügbar ist?

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.

Warum schwanken die Sensorwerte und wie glättet man sie?

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.

Können Sensoren im Hintergrund verwendet werden?

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

  • Sensors API — eine einheitliche Android-Schnittstelle zum Abrufen von Daten von Hardware-Sensoren des Geräts über SensorManager.
  • Drei Kategorien — Motion (Beschleunigungsmesser, Gyroskop), Position (Magnetometer) und Environment (Licht, Druck) mit unterschiedlichen Funktionsprinzipien und Anwendungen.
  • Virtuelle Sensoren — Gravity, Linear Acceleration und Rotation Vector basieren auf der Fusion von Daten physischer Sensoren und haben kein Hardware-Äquivalent.
  • Optimierung — die Wahl der richtigen Verzögerung (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) und die Verwendung der Batch-Verarbeitung reduzieren den Stromverbrauch um bis zu 60%.
  • Einschränkungen — Android 8+ reduziert die Sensorrate im Hintergrund, Android 12+ erfordert BODY_SENSORS_BACKGROUND für den Hintergrundzugriff.
  • Grundprüfung — vor der Listener-Registrierung die Sensorverfügbarkeit über getDefaultSensor oder hasSystemFeature prüfen.
  • Verwenden Sie einen Tiefpassfilter zum Glätten von Rauschen und melden Sie den Listener beim Wechsel in den Hintergrund ab, um Akku zu sparen.

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.

Projekt besprechen

Lesen Sie auch