Sensors API: vad är det, sensortyper och arbete med sensorer

Författare: IT Sectr Publicerad: 2026-03-26 Lästid: 10 min

Sensors API — är Android-plattformens gränssnitt för åtkomst till enhetens hårdvarusensorer. API:et tillhandahåller ett enhetligt sätt att hämta data från accelerometer, gyroskop, magnetometer, ljussensor och andra sensorer. Enligt Google, 2026 är över 95% av moderna Android-enheter utrustade med minst tre sensortyper, vilket öppnar breda möjligheter för utveckling av kontextmedvetna applikationer.

Huvudpunkter

  • Sensors API — enhetligt Android-gränssnitt för arbete med enhetens hårdvarusensorer.
  • Tre kategorier — Motion-, Position- och Environment-sensorer med olika mätprinciper.
  • SensorManager — systemtjänst för att få listan över sensorer och registrera lyssnare.
  • Uppdateringsfrekvens ställs in via SENSOR_DELAY-konstanter från NORMAL till FASTEST.
  • Virtuella sensorer — Gravity, Rotation Vector och Linear Acceleration baserade på kombination av fysiska sensorer.

Vad är Sensors API i Android?

Sensors API — är programmeringsgränssnittet för Android Framework, som ger utvecklare åtkomst till mobilenhetens hårdvarusensorer. API:et är en del av Android SDK sedan version 1.0 och är tillgängligt via paketet android.hardware. Gränssnittet abstraherar skillnaderna mellan sensorimplementationer från olika tillverkare — Qualcomm, MediaTek, Samsung Exynos — och tillhandahåller en enhetlig modell för arbete med sensorer.

Huvudfunktioner i Sensors API

API:et möjliggör tre nyckeloperationer: hämta listan över tillgängliga sensorer, registrera lyssnare för att ta emot data och hantera frekvensen för avläsningar. SensorManager är den centrala åtkomstpunkten för alla operationer. Systemet meddelar applikationen via callback onSensorChanged och skickar ett SensorEvent-objekt med en array av float-värden.

Evolution av Sensors API

Under Androidens existens har API:et genomgått flera utvecklingsfaser. I version 2.3 (Gingerbread) introducerades stöd för Batch Processing — gruppering av sensorhändelser för att minska energiförbrukningen. Android 4.0 (Ice Cream Sandwich) lade till virtuella sensorerna Gravity och Linear Acceleration. Från och med Android 8.0 begränsade systemet bakgrundsåtkomst till sensorer för ökad integritet.

kotlin
val sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
val sensorList: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
sensorList.forEach { sensor ->
    Log.d("Sensorer", "${sensor.name} — ${sensor.type}")
}

Begränsningar och krav

Alla enheter har inte samma uppsättning sensorer. Applikationen måste kontrollera tillgängligheten av en specifik sensor innan en lyssnare registreras. Android-emulatorn stöder endast en begränsad uppsättning sensorer — accelerometer och magnetometer. För testning av övriga sensorer krävs en fysisk enhet. Från och med Android 12 måste applikationer deklarera användning av sensorer i manifestet.

Android sensortyper: Motion, Position, Environment

Android klassificerar alla sensorer i tre kategorier: Motion (rörelse), Position (position) och Environment (miljö). Motion-sensorer inkluderar accelerometer, gyroskop och stegräknare. Position-sensorer innehåller magnetometer och Orientation. Environment — ljussensor, tryck, temperatur och luftfuktighet.

KategoriSensorerTyp (konstant)Fysisk/Virtuell
MotionAccelerometerTYPE_ACCELEROMETERFysisk
MotionGyroskopTYPE_GYROSCOPEFysisk
MotionStegräknareTYPE_STEP_COUNTERFysisk
MotionGravityTYPE_GRAVITYVirtuell
PositionMagnetometerTYPE_MAGNETIC_FIELDFysisk
PositionRotation VectorTYPE_ROTATION_VECTORVirtuell
EnvironmentLjussensorTYPE_LIGHTFysisk
EnvironmentTryckTYPE_PRESSUREFysisk

Motion-sensorer: accelerometer och gyroskop

Accelerometern mäter acceleration i m/s² längs tre axlar — X, Y och Z. Värdena inkluderar gravitation (9.8 m/s² på Z-axeln i vila). Gyroskopet mäter vinkelhastighet i rad/s — enhetens rotationshastighet runt varje axel. Kombinationen av dessa två sensorer används i navigering, spel och AR-applikationer.

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-sensorer: magnetometer och orientering

Magnetometern (TYPE_MAGNETIC_FIELD) mäter magnetfältet i mikrotesla (µT) längs tre axlar. Används som digital kompass — i kombination med accelerometern möjliggör den bestämning av enhetens azimut. Rotation Vector — en virtuell sensor som kombinerar data från gyroskop, accelerometer och magnetometer för noggrann orienteringsbestämning.

Environment-sensorer: ljussensor, tryck, temperatur

Ljussensorn (TYPE_LIGHT) mäter nivån av externt ljus i lux (lx). Används för automatisk justering av skärmens ljusstyrka. Trycksensorn (TYPE_PRESSURE) mäter atmosfärstryck i hektopascal (hPa) — används i navigationsapplikationer för att bestämma höjd över havet.

Hur Sensors API-arkitekturen fungerar

Sensors API är byggt på en klient-server-arkitektur. Applikationen fungerar som klient, SensorManager — som Android-systemtjänst. När applikationen registrerar en lyssnare via registerListener, ansluter SensorManager till HAL (Hardware Abstraction Layer) — den lågnivåiga sensordrivrutinen som fungerar på Linux-kärnnivå.

Livscykel för en sensorhändelse

HAL-drivrutinen tar emot rådata från hårdvaruchippet, filtrerar brus och skickar dem uppåt i stacken — via SensorService (systemprocess) till applikationen. Data överförs som ett SensorEvent-objekt som innehåller en array av float-värden values och en tidsstämpel i nanosekunder. Frekvensen av händelser beror på valt leveransläge.

Leveranslägen för händelser

Vid registrering av lyssnare specificerar utvecklaren önskad fördröjning mellan händelser via konstanterna SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) och SENSOR_DELAY_FASTEST (0 ms — maximal frekvens). Den faktiska frekvensen kan variera — systemet optimerar energiförbrukningen.

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

Batch-bearbetning (Batch Processing)

Från och med Android 2.3 stöder sensorer batch-läge — händelser ackumuleras i en FIFO-buffert och levereras i ett paket. Detta gör att processorn kan stanna i sovläge längre, vilket minskar energiförbrukningen med upp till 60%. Buffertstorleken beror på sensorchippet och anges i fältet Sensor.fifoMaxEventCount.

Använda SensorManager för åtkomst till sensorer

SensorManager — systemtjänst tillgänglig via getSystemService(Context.SENSOR_SERVICE). Tillhandahåller metoder för att hämta listan över sensorer, hämta en specifik standardsensor och registrera/avregistrera lyssnare. SensorManager — singleton, en instans för hela applikationen.

Kontrollera sensorns tillgänglighet

Innan en sensor används måste dess närvaro kontrolleras. Metoden getDefaultSensor(type) returnerar null om sensorn inte är tillgänglig på enheten. Att få null utan kontroll leder till NullPointerException vid registrering av lyssnare. Listan över alla sensorer returneras av metoden getSensorList(type).

kotlin
fun checkSensorAvailability(type: Int): Boolean {
    val sensorManager =
        getSystemService(Context.SENSOR_SERVICE) as SensorManager
    return sensorManager.getDefaultSensor(type) != null
}

// Användning:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
    Log.d("Sensor", "Gyroskop tillgängligt")
}

Registrera och avregistrera lyssnare

Lyssnaren registreras via registerListener(listener, sensor, delay). Viktigt: avregistrering av lyssnaren måste göras i metoden onPause() via unregisterListener(listener). Om detta inte görs kommer applikationen fortsätta att ta emot sensorhändelser, vilket tömmer batteriet även i bakgrunden. Android 8+ visar en varning i logcat om oregistrerade lyssnare.

Hantering av noggrannhetsförändring

Metoden onAccuracyChanged(sensor, accuracy) anropas när sensorns noggrannhet ändras. Värden: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW och UNRELIABLE. Vid mottagning av UNRELIABLE bör sensordata ignoreras tills noggrannheten återställs. Till exempel kräver magnetometern kalibrering — skakning av enheten i en åttas form.

Kodexempel för arbete med sensorer i Kotlin

Låt oss titta på praktiska exempel på användning av Sensors API i Android-applikationer i Kotlin. Första exemplet — bestämning av skärmorientering med accelerometer. Andra — avläsning av magnetometerdata med kalibrering. Tredje — stegdetektor med stegräknare.

Bestämning av enhetsorientering

För att bestämma orientering används en kombination av accelerometer och magnetometer. Metoden SensorManager.getRotationMatrix() beräknar rotationsmatrisen, och getOrientation() extraherar vinklarna pitch, roll och azimuth. Azimuth (azimut) — vinkeln relativt magnetiska nord i radianer.

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

Stegdetektor med stegräknare

Stegräknaren (TYPE_STEP_COUNTER) returnerar det totala antalet steg som användaren har tagit sedan enhetens senaste omstart. Sensorn fungerar på hårdvarunivå — den är aktiv även när applikationen inte körs. För att få antalet steg per session måste startvärdet sparas och skillnaden beräknas.

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("Steg", "Steg per session: $sessionSteps")
    }
}

Adaptiv ljusstyrka baserat på ljussensor

Ljussensorn gör det möjligt att anpassa gränssnittet till omgivningsförhållandena. Vid svagt ljus (mindre än 10 lx) kan man växla till mörkt tema. Vid starkt solljus (mer än 10000 lx) — öka kontrasten. För filtrering av brus används ett glidande medelvärde av de senaste 5 värdena.

Virtuella sensorer och fusionsalgoritmer

Android tillhandahåller flera virtuella sensorer som inte har någon direkt hårdvaruekvivalent. En virtuell sensor beräknar sina avläsningar baserat på en kombination av fysiska sensorer. Detta minskar utvecklarens börda — systemet implementerar själv datafusionsalgoritmerna.

Gravity och Linear Acceleration

Sensorn Gravity (TYPE_GRAVITY) extraherar gravitationskomponenten från accelerometeravläsningarna med hjälp av ett lågpassfilter. Linear Acceleration (TYPE_LINEAR_ACCELERATION) — tvärtom, tar bort gravitationen och lämnar endast enhetens linjära acceleration. Summan av Gravity och Linear Acceleration ger råa accelerometeravläsningar.

Rotation Vector

Rotation Vector — den mest komplexa virtuella sensorn. Den kombinerar data från gyroskop (högfrekventa förändringar), accelerometer (gravitationsvektor) och magnetometer (orientering relativt norr). Resultatet — en kvaternion som beskriver enhetens absoluta orientering i rymden. Används i AR-applikationer och VR-headset.

Game Rotation Vector

Game Rotation Vector — en förenklad version av Rotation Vector utan användning av magnetometer. Detta ger lägre noggrannhet vid azimutbestämning, men högre uppdateringsfrekvens och stabilitet. Rekommenderas för spel där låg latens är viktig, inte absolut orientering relativt norr.

Optimera energiförbrukningen vid arbete med sensorer

Sensorer — en av de mest energikrävande komponenterna i enheten. Accelerometern och gyroskopet vid maximal avfrågningsfrekvens kan tömma batteriet på 3–4 timmars kontinuerlig användning. Att optimera arbetet med sensorer är en kritisk uppgift för varje applikation som använder Sensors API.

Välja optimal fördröjning

Använd inte SENSOR_DELAY_FASTEST i onödan. För UI-animationer räcker SENSOR_DELAY_UI (60 ms). För bestämning av skärmorientering — SENSOR_DELAY_NORMAL (200 ms). Ju högre frekvens, desto mer tid tillbringar processorn i aktivt tillstånd. Skillnaden mellan NORMAL och FASTEST är upp till 10x i energiförbrukning.

Avregistrera lyssnare i bakgrunden

Från och med Android 8.0 (API 26) får bakgrundsapplikationer sensorhändelser med reducerad frekvens. I Android 12+ kräver bakgrundsåtkomst till Motion- och Position-sensorer tillståndet BODY_SENSORS_BACKGROUND. Avregistrera lyssnaren när applikationen går i bakgrundsläge — detta förlänger enhetens batteritid.

Batch-bearbetning och FIFO-buffert

Använd batch-bearbetning via metoden registerListener(listener, sensor, delay, maxReportLatencyUs). Parametern maxReportLatencyUs anger maximal fördröjning av händelseleverans i mikrosekunder. Vid värdet 1000000 (1 sekund) ackumuleras händelserna i sensorns FIFO-buffert och levereras en gång per sekund — processorn vaknar mer sällan från sovläge.

Vanliga frågor

Vilka sensorer finns på alla Android-enheter?

Minimumuppsättningen — accelerometer och magnetometer. Dessa två sensorer finns på över 95% av enheterna. Gyroskop, ljussensor och närhetssensor — på 70–80% av moderna modeller. Övriga sensorer (tryck, temperatur, luftfuktighet, stegräknare) är mindre vanliga och beror på enhetens priskategori.

Vad är skillnaden mellan TYPE_ACCELEROMETER och TYPE_LINEAR_ACCELERATION?

TYPE_ACCELEROMETER returnerar full acceleration inklusive gravitation (9.8 m/s²). TYPE_LINEAR_ACCELERATION returnerar acceleration utan gravitation — endast acceleration från enhetens rörelse. Om enheten ligger stilla visar accelerometern 9.8 m/s² på Z-axeln, medan Linear Acceleration visar 0 på alla axlar.

Hur kontrollerar jag om enheten har den nödvändiga sensorn?

Använd getPackageManager().hasSystemFeature() med motsvarande konstanter: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY och andra. Alternativ metod — anropa getDefaultSensor(type) och kontrollera resultatet för null. Den första metoden är att föredra för kontroll i initieringsfasen.

Varför hoppar sensorvärdena och hur jämnar man ut dem?

Rådata från sensorer innehåller brus. För utjämning använd ett lågpassfilter: newValue = alpha * rawValue + (1 — alpha) * previousValue. Koefficienten alpha = 0.1–0.3 ger en bra balans mellan responsivitet och jämnhet. För gyroskopet används även ett högpassfilter för att ta bort nolldrift.

Kan sensorer användas i bakgrunden?

Ja, men med begränsningar. Från och med Android 8.0 minskas frekvensen av sensorhändelser för bakgrundsapplikationer. Från och med Android 12 krävs tillståndet BODY_SENSORS_BACKGROUND för åtkomst till sensorer i bakgrunden. För bakgrundsarbete rekommenderas att använda en Foreground Service med notifiering.

Sammanfattning

  • Sensors API — enhetligt Android-gränssnitt för att hämta data från enhetens hårdvarusensorer via SensorManager.
  • Tre kategorier — Motion (accelerometer, gyroskop), Position (magnetometer) och Environment (ljus, tryck) med olika funktionsprinciper och tillämpningar.
  • Virtuella sensorer — Gravity, Linear Acceleration och Rotation Vector baserade på fusion av data från fysiska sensorer, utan hårdvaruekvivalent.
  • Optimering — val av rätt fördröjning (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) och användning av batch-bearbetning minskar energiförbrukningen med upp till 60%.
  • Begränsningar — Android 8+ minskar sensorfrekvensen i bakgrunden, Android 12+ kräver BODY_SENSORS_BACKGROUND för bakgrundsåtkomst.
  • Grundläggande kontroll — före registrering av lyssnare, kontrollera sensorns tillgänglighet via getDefaultSensor eller hasSystemFeature.
  • Använd lågpassfilter för brusutjämning och avregistrera lyssnaren vid bakgrundsövergång för att spara batteri.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också