Sensors API: Nedir, sensör türleri ve sensörlerle çalışma

Yazar: IT Sectr Yayınlanma: 2026-03-26 Okuma süresi: 10 dk

Sensors API, cihazın donanım sensörlerine erişmek için bir Android platform arayüzüdür. API, ivmeölçer, jiroskop, manyetometre, ışık sensörü ve diğer sensörlerden veri almak için birleşik bir yol sağlar. Google, 2026'ya göre, modern Android cihazların %95'inden fazlası en az üç tür sensörle donatılmıştır ve bu da bağlam duyarlı uygulamalar geliştirmek için geniş fırsatlar sunar.

Önemli Noktalar

  • Sensors API — cihazın donanım sensörleriyle çalışmak için birleşik bir Android arayüzü.
  • Üç kategori — Motion, Position ve Environment sensörleri (farklı ölçüm prensipleriyle).
  • SensorManager — sensör listesini almak ve dinleyicileri kaydetmek için bir sistem servisi.
  • Güncelleme hızı, SENSOR_DELAY sabitleri (NORMAL'den FASTEST'e) ile ayarlanır.
  • Sanal sensörler — Gravity, Rotation Vector ve Linear Acceleration, fiziksel sensörlerin bir kombinasyonuna dayanır.

Android'de Sensors API Nedir?

Sensors API, geliştiricilere mobil cihazın donanım sensörlerine erişim sağlayan Android Framework'ün bir yazılım arayüzüdür. API, sürüm 1.0'dan beri Android SDK'nın bir parçasıdır ve android.hardware paketi aracılığıyla kullanılabilir. Arayüz, farklı üreticilerin (Qualcomm, MediaTek, Samsung Exynos) sensör uygulamaları arasındaki farkları soyutlar ve sensörlerle çalışmak için birleşik bir model sağlar.

Sensors API'nin Temel Özellikleri

API üç temel işleme izin verir: mevcut sensörlerin listesini alma, veri almak için dinleyicileri kaydetme ve güncelleme hızını yönetme. SensorManager, tüm işlemler için merkezi erişim noktası olarak görev yapar. Sistem, uygulamayı onSensorChanged geri çağrımı aracılığıyla bilgilendirir ve bir float değerler dizisi içeren SensorEvent nesnesi gönderir.

Sensors API'nin Evrimi

Android'in varlığı boyunca API, birkaç gelişim aşamasından geçti. Sürüm 2.3 (Gingerbread), toplu işlemeyi (güç tüketimini azaltmak için sensör olaylarını gruplama) desteklemeye başladı. Android 4.0 (Ice Cream Sandwich), Gravity ve Linear Acceleration sanal sensörlerini ekledi. Android 8.0'den itibaren sistem, gizliliği artırmak için sensörlere arka plan erişimini kısıtladı.

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

Sınırlamalar ve Gereksinimler

Tüm cihazlar aynı sensör setine sahip değildir. Bir uygulama, bir dinleyici kaydetmeden önce belirli bir sensörün kullanılabilirliğini kontrol etmelidir. Android Emülatörü yalnızca sınırlı bir sensör setini (ivmeölçer ve manyetometre) destekler. Diğer sensörleri test etmek için fiziksel bir cihaz gerekir. Android 12'den itibaren uygulamalar, manifest'te sensör kullanımını bildirmelidir.

Android Sensör Türleri: Motion, Position, Environment

Android tüm sensörleri üç kategoriye ayırır: Motion, Position ve Environment. Motion sensörleri ivmeölçer, jiroskop ve adım sayar içerir. Position sensörleri manyetometre ve yön içerir. Environment sensörleri ışık, basınç, sıcaklık ve nem içerir.

KategoriSensörlerTür (sabit)Fiziksel/Sanal
MotionİvmeölçerTYPE_ACCELEROMETERFiziksel
MotionJiroskopTYPE_GYROSCOPEFiziksel
MotionAdım SayarTYPE_STEP_COUNTERFiziksel
MotionGravityTYPE_GRAVITYSanal
PositionManyetometreTYPE_MAGNETIC_FIELDFiziksel
PositionRotation VectorTYPE_ROTATION_VECTORSanal
EnvironmentİşıkTYPE_LIGHTFiziksel
EnvironmentBasınçTYPE_PRESSUREFiziksel

Motion Sensörleri: İvmeölçer ve Jiroskop

İvmeölçer, üç eksen (X, Y ve Z) boyunca m/s² cinsinden ivmeyi ölçer. Değerler yerçekimini (dinlenme halinde Z ekseni boyunca 9,8 m/s²) içerir. Jiroskop, her eksen etrafında cihazın dönüş hızı olan açısal hızı rad/s cinsinden ölçer. Bu iki sensörün kombinasyonu navigasyon, oyunlar ve AR uygulamalarında kullanılır.

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 Sensörleri: Manyetometre ve Yön

Manyetometre (TYPE_MAGNETIC_FIELD), üç eksen boyunca manyetik alanı mikrotesla (µT) cinsinden ölçer. Dijital pusula olarak kullanılır — ivmeölçerle birleştirildiğinde cihazın azimutunu belirler. Rotation Vector, hassas yön belirleme için jiroskop, ivmeölçer ve manyetometreden gelen verileri birleştiren sanal bir sensördür.

Environment Sensörleri: Işık, Basınç, Sıcaklık

Işık sensörü (TYPE_LIGHT), ortam ışık seviyesini lüks (lx) cinsinden ölçer. Otomatik ekran parlaklığı ayarı için kullanılır. Basınç sensörü (TYPE_PRESSURE), atmosfer basıncını hektopaskal (hPa) cinsinden ölçer — navigasyon uygulamalarında deniz seviyesinden yüksekliği belirlemek için kullanılır.

Sensors API Mimarisi Nasıl Çalışır

Sensors API, istemci-sunucu mimarisi üzerine kurulmuştur. Uygulama istemci, SensorManager ise Android sistem servisi olarak çalışır. Uygulama registerListener aracılığıyla bir dinleyici kaydettiğinde, SensorManager, HAL (Donanım Soyutlama Katmanı) — Linux çekirdeği seviyesinde çalışan düşük seviyeli bir sensör sürுcüsüyle iletişim kurar.

Sensör Olayının Yaşam Döngüsü

HAL sürுcüsü, donanım çipinden ham verileri alır, gürültüyü filtreler ve yığının yukarısına — SensorService (sistem işlemi) aracılığıyla uygulamaya iletir. Veriler, bir float değerler dizisi values ve nanosaniye cinsinden bir zaman damgası içeren SensorEvent nesnesi olarak iletilir. Olay hızı, seçilen teslimat moduna bağlıdır.

Olay Teslimat Modları

Bir dinleyici kaydederken, geliştirici SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) ve SENSOR_DELAY_FASTEST (0 ms — maksimum hız) sabitlerini kullanarak olaylar arasında istenen gecikmeyi belirtir. Gerçek hız farklılık gösterebilir — sistem güç tüketimini optimize eder.

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

Toplu İşleme

Android 2.3'ten itibaren sensörler toplu modu destekler — olaylar bir FIFO arabelleğinde birikir ve tek bir toplu halinde teslim edilir. Bu, işlemcinin uyku modunda daha uzun süre kalmasını sağlayarak güç tüketimini %60'a kadar azaltır. Arabellek boyutu sensör çipine bağlıdır ve Sensor.fifoMaxEventCount alanında belirtilir.

Sensörlere Erişmek için SensorManager Kullanımı

SensorManager, getSystemService(Context.SENSOR_SERVICE) aracılığıyla kullanılabilen bir sistem servisidir. Sensör listesi alma, belirli bir varsayılan sensörü alma ve dinleyicileri kaydetme/kaydı silme yöntemleri sağlar. SensorManager bir singleton'dır — tüm uygulama için tek bir örnek.

Sensör Kullanılabilirliğini Kontrol Etme

Bir sensörü kullanmadan önce, kullanılabilirliğini kontrol etmelisiniz. getDefaultSensor(type) yöntemi, sensör cihazda mevcut değilse null döndürür. Kontrol etmeden null almak, bir dinleyici kaydederken NullPointerException'a neden olur. getSensorList(type) yöntemi tüm sensörlerin bir listesini döndürür.

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

// Kullanım:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
    Log.d("Sensör", "Jiroskop mevcut")
}

Dinleyici Kaydetme ve Kaydı Silme

Bir dinleyici registerListener(listener, sensor, delay) aracılığıyla kaydedilir. Önemli: onPause() yönteminde unregisterListener(listener) aracılığıyla dinleyicinin kaydını silmelisiniz. Bu yapılmazsa, uygulama arka planda bile sensör olaylarını almaya devam ederek pili tüketir. Android 8+, kaydı silinmemiş dinleyiciler hakkında logcat'te bir uyarı gösterir.

Doğruluk Değişikliklerini İşleme

onAccuracyChanged(sensor, accuracy) yöntemi, sensör doğruluğu değiştiğinde çağrılır. Değerler: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW ve UNRELIABLE. UNRELIABLE alındığında, doğruluk geri yüklenene kadar sensör verileri görmezden gelinmelidir. Örneğin, manyetometre kalibrasyon gerektirir — cihazı sekiz şeklinde sallamak.

Kotlin'de Sensörlerle Çalışmak için Kod Örnekleri

Kotlin ile Android uygulamalarında Sensors API kullanımına ilişkin pratik örneklere bakalım. İlk örnek — ivmeölçer kullanarak ekran yönünü belirleme. İkincisi — kalibrasyonla manyetometre verilerini okuma. Üçüncüsü — adım sayar kullanan bir adım dedektörü.

Cihaz Yönünü Belirleme

Yönü belirlemek için ivmeölçer ve manyetometrenin bir kombinasyonu kullanılır. SensorManager.getRotationMatrix() yöntemi dönüş matrisini hesaplar ve getOrientation() pitch, roll ve azimuth açılarını çıkarır. Azimuth — radyan cinsinden manyetik kuzeye göre açı.

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

Adım Sayar ile Adım Dedektörü

Adım sayar (TYPE_STEP_COUNTER), son cihaz yeniden başlatmasından bu yana kullanıcının attığı toplam adım sayısını döndürür. Sensör donanım seviyesinde çalışır — uygulama çalışmasa bile etkindir. Oturum başına adım almak için başlangıç değerini kaydetmeniz ve farkı hesaplamanız gerekir.

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("Adımlar", "Oturum başına adım: $sessionSteps")
    }
}

Işık Sensörü ile Uyarlanabilir Parlaklık

Işık sensörü, arayüzün ortam koşullarına uyarlanmasını sağlar. Düşük ışıkta (10 lx'ten az), karanlık moda geçebilirsiniz. Parlak güneş ışığında (10000 lx'ten fazla), kontrastı artırabilirsiniz. Gürültü filtreleme için son 5 değerin hareketli ortalaması kullanılır.

Sanal Sensörler ve Füzyon Algoritmaları

Android, doğrudan donanım karşılığı olmayan birkaç sanal sensör sağlar. Bir sanal sensör, okumalarını fiziksel sensörlerin bir kombinasyonuna dayanarak hesaplar. Bu, geliştirici üzerindeki yükü azaltır — sistem veri füzyon algoritmalarını kendisi uygular.

Gravity ve Linear Acceleration

Gravity (TYPE_GRAVITY) sensörü, düşük geçişli bir filtre kullanarak ivmeölçer okumalarından yerçekimi bileşenini çıkarır. Linear Acceleration (TYPE_LINEAR_ACCELERATION) ise tam tersine yerçekimini kaldırır ve yalnızca cihazın doğrusal ivmesini bırakır. Gravity ve Linear Acceleration'ın toplamı, ivmeölçerin ham okumalarını verir.

Rotation Vector

Rotation Vector — en karmaşık sanal sensör. Jiroskop (yüksek frekanslı değişiklikler), ivmeölçer (yerçekimi vektörü) ve manyetometreden (kuzeye göre yön) verileri birleştirir. Sonuç, cihazın uzaydaki mutlak yönünü tanımlayan bir kuaterniyondur. AR uygulamalarında ve VR başlıklarında kullanılır.

Game Rotation Vector

Game Rotation Vector — manyetometre kullanmadan Rotation Vector'ın basitleştirilmiş bir sürümüdür. Bu, daha düşük azimut doğruluğu ancak daha yüksek güncelleme hızı ve kararlılık sağlar. Mutlak kuzey yönünden ziyade düşük gecikmenin önemli olduğu oyunlar için önerilir.

Sensörlerle Çalışırken Pil Optimizasyonu

Sensörler, cihazın en çok güç tüketen bileşenlerinden biridir. Maksimum yoklama hızındaki ivmeölçer ve jiroskop, 3–4 saatlik sürekli çalışmayla pili tüketebilir. Sensör kullanımını optimize etmek, Sensors API kullanan herhangi bir uygulama için kritik bir görevdir.

En Uygun Gecikmeyi Seçme

Gereksiz yere SENSOR_DELAY_FASTEST kullanmayın. UI animasyonları için SENSOR_DELAY_UI (60 ms) yeterlidir. Ekran yönü algılaması için — SENSOR_DELAY_NORMAL (200 ms). Hız ne kadar yüksekse, işlemci o kadar fazla zamanı aktif durumda geçirir. NORMAL ve FASTEST arasındaki güç tüketimi farkı 10 kata kadar çıkabilir.

Arka Planda Dinleyicilerin Kaydını Silme

Android 8.0'dan (API 26) itibaren, arka plan uygulamaları sensör olaylarını azaltılmış hızda alır. Android 12+'da, Motion ve Position sensörlerine arka plan erişimi için BODY_SENSORS_BACKGROUND izni gerekir. Uygulama arka plana geçtiğinde dinleyicinin kaydını silin — bu, cihaz pil ömrünü uzatır.

Toplu İşleme ve FIFO Arabelleği

registerListener(listener, sensor, delay, maxReportLatencyUs) yöntemi aracılığıyla toplu işlemeyi kullanın. maxReportLatencyUs parametresi, mikro saniye cinsinden maksimum olay teslimat gecikmesini ayarlar. 1000000 (1 saniye) değerinde, olaylar sensörün FIFO arabelleğinde birikir ve saniyede bir teslim edilir — işlemci daha az sık uyanır.

Sıkça Sorulan Sorular

Tüm Android cihazlarda hangi sensörler bulunur?

Minimum set bir ivmeölçer ve manyetometredir. Bu iki sensör, cihazların %95'inden fazlasında bulunur. Jiroskop, ışık sensörü ve yakınlık sensörü — modern modellerin %70–80'inde. Diğer sensörler (basınç, sıcaklık, nem, adım sayar) daha az yaygındır ve cihazın fiyat kategorisine bağlıdır.

TYPE_ACCELEROMETER ve TYPE_LINEAR_ACCELERATION arasındaki fark nedir?

TYPE_ACCELEROMETER, yerçekimi dahil toplam ivmeyi (9,8 m/s²) döndürür. TYPE_LINEAR_ACCELERATION, yerçekimi hariç ivmeyi — yalnızca cihazın hareket ivmesini döndürür. Cihaz hareketsiz duruyorsa, ivmeölçer Z ekseni boyunca 9,8 m/s² gösterirken, Linear Acceleration tüm eksenlerde 0 gösterir.

Cihazda gerekli sensörün olup olmadığını nasıl kontrol edebilirim?

Uygun sabitlerle getPackageManager().hasSystemFeature() kullanın: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY ve diğerleri. Alternatif bir yöntem, getDefaultSensor(type) çağırmak ve sonucu null için kontrol etmektir. İlk yöntem, başlatma sırasında kontrol için tercih edilir.

Sensör değerleri neden dalgalanır ve bunları nasıl yumuşatabilirim?

Sensörlerden gelen ham veriler gürültü içerir. Yumuşatmak için bir düşük geçişli filtre kullanın: newValue = alpha * rawValue + (1 — alpha) * previousValue. 0,1–0,3'lük bir alpha katsayısı, yanıt verme ve yumuşaklık arasında iyi bir denge sağlar. Jiroskop için, sıfır kaymasını gidermek için bir yüksek geçişli filtre de uygulanır.

Sensörler arka planda kullanılabilir mi?

Evet, ancak sınırlamalarla. Android 8.0'den itibaren, arka plan uygulamaları için sensör olay hızı düşer. Android 12'den itibaren, arka plan sensör erişimi için BODY_SENSORS_BACKGROUND izni gerekir. Arka planda çalışmak için bir bildirimle birlikte Foreground Service kullanılması önerilir.

Özet

  • Sensors API — SensorManager aracılığıyla cihazın donanım sensörlerinden veri almak için birleşik bir Android arayüzü.
  • Üç kategori — Motion (ivmeölçer, jiroskop), Position (manyetometre) ve Environment (ışık, basınç) farklı çalışma prensipleri ve uygulamalarıyla.
  • Sanal sensörler — Gravity, Linear Acceleration ve Rotation Vector, fiziksel sensörlerden veri füzyonuna dayanır ve donanım karşılığı yoktur.
  • Optimizasyon — doğru gecikmeyi seçmek (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) ve toplu işlemeyi kullanmak güç tüketimini %60'a kadar azaltır.
  • Sınırlamalar — Android 8+ arka planda sensör hızını düşürür, Android 12+ arka plan erişimi için BODY_SENSORS_BACKGROUND gerektirir.
  • Temel kontrol — bir dinleyici kaydetmeden önce, getDefaultSensor veya hasSystemFeature ile sensör kullanılabilirliğini kontrol edin.
  • Gürültüyü yumuşatmak için bir düşük geçişli filtre kullanın ve pilden tasarruf etmek için arka plana geçerken dinleyicinin kaydını silin.

Anahtar teslim bir mobil uygulama geliştireceğiz

IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.

Projeyi tartış

Ayrıca okuyun