Sensors API: bu nima, sensor turlari va sensorlar bilan ishlash

Muallif: IT Sectr Nashr etilgan: 2026-03-26 O'qish vaqti: 10 daq

Sensors API — qurilmaning apparat sensorlariga kirish uchun Android platformasi interfeysi. API akselerometr, giroskop, magnitometr, yorug'lik sensori va boshqa sensorlardan ma'lumot olishning yagona usulini taqdim etadi. Google, 2026 ma'lumotlariga ko'ra, zamonaviy Android qurilmalarining 95% dan ortig'i kamida uch turdagi sensorlar bilan jihozlangan, bu kontekstga bog'liq ilovalarni ishlab chiqish uchun keng imkoniyatlar ochadi.

Asosiy fikrlar

  • Sensors API — qurilmaning apparat sensorlari bilan ishlash uchun yagona Android interfeysi.
  • Uch toifa — Motion, Position va Environment sensorlari turli o'lchash printsiplari bilan.
  • SensorManager — sensorlar ro'yxatini olish va tinglovchilarni ro'yxatdan o'tkazish uchun tizim xizmati.
  • Yangilanish chastotasi NORMAL dan FASTEST gacha SENSOR_DELAY konstantalari orqali o'rnatiladi.
  • Virtual sensorlar — Gravity, Rotation Vector va Linear Acceleration jismoniy sensorlar kombinatsiyasiga asoslangan.

Android-da Sensors API nima?

Sensors API — Android Framework ning dasturiy interfeysi bo'lib, dasturchilarga mobil qurilmaning apparat sensorlariga kirish imkonini beradi. API 1.0 versiyasidan boshlab Android SDK tarkibiga kiradi va android.hardware paketi orqali mavjud. Interfeys turli ishlab chiqaruvchilar — Qualcomm, MediaTek, Samsung Exynos — sensorlarining amalga oshirilishidagi farqlarni abstraktlashtiradi va sensorlar bilan ishlash uchun yagona modelni taqdim etadi.

Sensors API ning asosiy imkoniyatlari

API uchta asosiy operatsiyani bajarishga imkon beradi: mavjud sensorlar ro'yxatini olish, ma'lumot olish uchun tinglovchilarni ro'yxatdan o'tkazish va o'qishlar chastotasini boshqarish. SensorManager barcha operatsiyalarga markaziy kirish nuqtasi sifatida xizmat qiladi. Tizim ilovani onSensorChanged callback orqali float qiymatlar massivi bo'lgan SensorEvent obyektini uzatib xabardor qiladi.

Sensors API ning evolyutsiyasi

Android mavjudligi davomida API bir necha rivojlanish bosqichlaridan o'tdi. 2.3 (Gingerbread) versiyasida Batch Processing qo'llab-quvvatlashi — energiya sarfini kamaytirish uchun sensor hodisalarini guruhlash paydo bo'ldi. Android 4.0 (Ice Cream Sandwich) Gravity va Linear Acceleration virtual sensorlarini qo'shdi. Android 8.0 dan boshlab, tizim maxfiylikni oshirish uchun sensorlarga fon kirishini chekladi.

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

Cheklovlar va talablar

Barcha qurilmalar bir xil sensorlar to'plamiga ega emas. Ilova tinglovchini ro'yxatdan o'tkazishdan oldin ma'lum bir sensorning mavjudligini tekshirishi kerak. Android emulyatori faqat cheklangan sensorlar to'plamini — akselerometr va magnitometrni qo'llab-quvvatlaydi. Qolgan sensorlarni sinash uchun jismoniy qurilma talab qilinadi. Android 12 dan boshlab, ilovalar sensordan foydalanishni manifestda deklaratsiya qilishi kerak.

Android sensor turlari: Motion, Position, Environment

Android barcha sensorlarni uch toifaga ajratadi: Motion (harakat), Position (holat) va Environment (atrof-muhit). Motion sensorlari akselerometr, giroskop va qadam o'lchagichni o'z ichiga oladi. Position sensorlari magnitometr va Orientation ni o'z ichiga oladi. Environment — yorug'lik, bosim, harorat va namlik sensori.

ToifaSensorlarTur (doimiy)Jismoniy/Virtual
MotionAkselerometrTYPE_ACCELEROMETERJismoniy
MotionGiroskopTYPE_GYROSCOPEJismoniy
MotionQadam o'lchagichTYPE_STEP_COUNTERJismoniy
MotionGravityTYPE_GRAVITYVirtual
PositionMagnitometrTYPE_MAGNETIC_FIELDJismoniy
PositionRotation VectorTYPE_ROTATION_VECTORVirtual
EnvironmentYorug'likTYPE_LIGHTJismoniy
EnvironmentBosimTYPE_PRESSUREJismoniy

Motion sensorlari: akselerometr va giroskop

Akselerometr uch o'q — X, Y va Z bo'yicha m/s² da tezlanishni o'lchaydi. Qiymatlar tortishish kuchini (tinch holatda Z o'qi bo'yicha 9.8 m/s²) o'z ichiga oladi. Giroskop rad/s da burchak tezligini — qurilmaning har bir o'q atrofida aylanish tezligini o'lchaydi. Bu ikki sensorning kombinatsiyasi navigatsiya, o'yinlar va AR ilovalarida qo'llaniladi.

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 sensorlari: magnitometr va orientatsiya

Magnitometr (TYPE_MAGNETIC_FIELD) uch o'q bo'yicha magnit maydonini mikrotesla (µT) da o'lchaydi. Raqamli kompas sifatida ishlatiladi — akselerometr bilan birgalikda qurilmaning azimutini aniqlash imkonini beradi. Rotation Vector — giroskop, akselerometr va magnitometr ma'lumotlarini birlashtiruvchi virtual sensor.

Environment sensorlari: yorug'lik, bosim, harorat

Yorug'lik sensori (TYPE_LIGHT) tashqi yoritish darajasini lyuks (lx) da o'lchaydi. Ekran yorqinligini avtomatik sozlash uchun ishlatiladi. Bosim sensori (TYPE_PRESSURE) atmosfera bosimini gektopaskal (hPa) da o'lchaydi — dengiz sathidan balandlikni aniqlash uchun navigatsiya ilovalarida qo'llaniladi.

Sensors API arxitekturasi qanday ishlaydi

Sensors API mijoz-server arxitekturasi asosida qurilgan. Ilova mijoz, SensorManager — Android tizim xizmati sifatida ishlaydi. Ilova registerListener orqali tinglovchini ro'yxatdan o'tkazganda, SensorManager Linux yadrosi darajasida ishlaydigan past darajali sensor drayveri bo'lgan HAL (Hardware Abstraction Layer) bilan bog'lanadi.

Sensor hodisasining hayot aylanishi

HAL drayveri apparat chipidan xom ma'lumotlarni oladi, shovqinni filtrlaydi va ularni yuqoriga — SensorService (tizim jarayoni) orqali ilovaga uzatadi. Ma'lumotlar values float qiymatlar massivi va nanosekundlarda vaqt belgisi bo'lgan SensorEvent obyekti sifatida uzatiladi. Hodisalar chastotasi tanlangan yetkazib berish rejimiga bog'liq.

Hodisalarni yetkazib berish rejimlari

Tinglovchini ro'yxatdan o'tkazishda dasturchi hodisalar orasidagi kerakli kechikishni SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms) va SENSOR_DELAY_FASTEST (0 ms — maksimal chastota) konstantalari orqali belgilaydi. Haqiqiy chastota farq qilishi mumkin — tizim energiya sarfini optimallashtiradi.

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

To'pli qayta ishlash (Batch Processing)

Android 2.3 dan boshlab, sensorlar to'pli rejimni qo'llab-quvvatlaydi — hodisalar FIFO buferida to'planadi va bitta paketda yetkaziladi. Bu protsessorning uyqu rejimida uzoqroq qolishiga imkon beradi, energiya sarfini 60% gacha kamaytiradi. Bufer hajmi sensor chipiga bog'liq va Sensor.fifoMaxEventCount maydonida ko'rsatilgan.

Sensorlarga kirish uchun SensorManager dan foydalanish

SensorManagergetSystemService(Context.SENSOR_SERVICE) orqali mavjud bo'lgan tizim xizmati. Sensorlar ro'yxatini olish, ma'lum bir standart sensorni olish va tinglovchilarni ro'yxatdan o'tkazish/bekor qilish usullarini taqdim etadi. SensorManager — singleton, butun ilova uchun bitta nusxa.

Sensor mavjudligini tekshirish

Sensordan foydalanishdan oldin uning mavjudligini tekshirish kerak. getDefaultSensor(type) usuli qurilmada sensor bo'lmasa null qaytaradi. null olish tekshirilmasa, tinglovchini ro'yxatdan o'tkazishda NullPointerException yuz beradi. Barcha sensorlar ro'yxatini getSensorList(type) usuli qaytaradi.

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

// Foydalanish:
if (checkSensorAvailability(Sensor.TYPE_GYROSCOPE)) {
    Log.d("Sensor", "Giroskop mavjud")
}

Tinglovchini ro'yxatdan o'tkazish va bekor qilish

Tinglovchi registerListener(listener, sensor, delay) orqali ro'yxatdan o'tkaziladi. Muhim: tinglovchini onPause() usulida unregisterListener(listener) orqali bekor qilish kerak. Agar bu bajarilmasa, ilova fonda ham sensor hodisalarini qabul qilishda davom etib, batareyani zaryadsizlantiradi. Android 8+ logcat da ro'yxatdan o'tmagan tinglovchilar haqida ogohlantirish chiqaradi.

Aniqlik o'zgarishini qayta ishlash

onAccuracyChanged(sensor, accuracy) usuli sensor aniqligi o'zgarganda chaqiriladi. Qiymatlar: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW va UNRELIABLE. UNRELIABLE olinganda sensor ma'lumotlari aniqlik tiklanmaguncha e'tiborga olinmasligi kerak. Masalan, magnitometr kalibrlashni talab qiladi — qurilmani sakkiz raqami shaklida silkitish.

Kotlin da sensorlar bilan ishlash uchun kod namunalari

Kotlin da Android ilovalarida Sensors API dan foydalanishning amaliy misollarini ko'rib chiqamiz. Birinchi misol — akselerometr yordamida ekran orientatsiyasini aniqlash. Ikkinchi — kalibrlash bilan magnitometr ko'rsatkichlarini o'qish. Uchinchi — qadam o'lchagich yordamida qadam detektori.

Qurilma orientatsiyasini aniqlash

Orientatsiyani aniqlash uchun akselerometr va magnitometr kombinatsiyasi qo'llaniladi. SensorManager.getRotationMatrix() usuli aylanish matritsasini hisoblaydi, getOrientation() esa pitch, roll va azimuth burchaklarini chiqaradi. Azimuth (azimut) — magnit shimoliga nisbatan radianlardagi burchak.

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

Qadam o'lchagich bilan qadam detektori

Qadam o'lchagich (TYPE_STEP_COUNTER) qurilma oxirgi marta qayta yoqilganidan beri foydalanuvchi bosgan qadamlarning umumiy sonini qaytaradi. Sensor apparat darajasida ishlaydi — ilova ishga tushmagan bo'lsa ham faol. Sessiya davomidagi qadamlarni olish uchun boshlang'ich qiymatni saqlash va farqni hisoblash kerak.

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("Qadamlar", "Sessiyadagi qadamlar: $sessionSteps")
    }
}

Yorug'lik sensoriga asoslangan adaptiv yorqinlik

Yorug'lik sensori interfeysni atrof-muhit sharoitlariga moslashtirish imkonini beradi. Past yoritishda (10 lx dan kam) qorong'i temaga o'tish mumkin. Yorqin quyosh nurida (10000 lx dan ko'p) — kontrastni oshirish mumkin. Shovqinni filtrlash uchun oxirgi 5 qiymat bo'yicha harakatlanuvchi o'rtacha qo'llaniladi.

Virtual sensorlar va birlashtirish algoritmlari

Android to'g'ridan-to'g'ri apparat analogiga ega bo'lmagan bir nechta virtual sensorlarni taqdim etadi. Virtual sensor o'z ko'rsatkichlarini jismoniy sensorlar kombinatsiyasi asosida hisoblab chiqadi. Bu dasturchining yukini kamaytiradi — tizim o'zi ma'lumotlarni birlashtirish algoritmlarini amalga oshiradi.

Gravity va Linear Acceleration

Gravity (TYPE_GRAVITY) sensori past o'tkazuvchan (low-pass) filtr yordamida akselerometr ko'rsatkichlaridan tortishish komponentini ajratib oladi. Linear Acceleration (TYPE_LINEAR_ACCELERATION) — aksincha, tortishishni olib tashlaydi va faqat qurilmaning chiziqli tezlanishini qoldiradi. Gravity va Linear Acceleration yig'indisi akselerometrning xom ko'rsatkichlarini beradi.

Rotation Vector

Rotation Vector — eng murakkab virtual sensor. U giroskop (yuqori chastotali o'zgarishlar), akselerometr (tortishish vektori) va magnitometr (shimolga nisbatan orientatsiya) ma'lumotlarini birlashtiradi. Natija — qurilmaning fazodagi mutlaq orientatsiyasini tavsiflovchi kvaternion. AR ilovalari va VR ko'zoynaklarida qo'llaniladi.

Game Rotation Vector

Game Rotation Vector — magnitometrsiz Rotation Vector ning soddalashtirilgan versiyasi. Bu azimutni aniqlashda pastroq aniqlik, lekin yuqoriroq yangilanish chastotasi va barqarorlik beradi. Past kechikish muhim bo'lgan, shimolga nisbatan mutlaq orientatsiya muhim bo'lmagan o'yinlar uchun tavsiya etiladi.

Sensorlar bilan ishlashda energiya sarfini optimallashtirish

Sensorlar — qurilmaning eng energiya talab qiladigan komponentlaridan biri. Maksimal so'rov chastotasida akselerometr va giroskop batareyani 3–4 soat uzluksiz ishda zaryadsizlantirishi mumkin. Sensorlar bilan ishlashni optimallashtirish Sensors API dan foydalanadigan har qanday ilova uchun muhim vazifadir.

Optimal kechikishni tanlash

Keraksiz SENSOR_DELAY_FASTEST dan foydalanmang. UI animatsiyalari uchun SENSOR_DELAY_UI (60 ms) yetarli. Ekran orientatsiyasini aniqlash uchun — SENSOR_DELAY_NORMAL (200 ms). Chastota qanchalik yuqori bo'lsa, protsessor faol holatda shuncha ko'p vaqt o'tkazadi. NORMAL va FASTEST o'rtasidagi farq energiya sarfida 10x gacha.

Fonda tinglovchilarni bekor qilish

Android 8.0 dan (API 26) boshlab, fon ilovalari sensor hodisalarini pasaytirilgan chastotada oladi. Android 12+ da Motion va Position sensorlariga fon kirishi BODY_SENSORS_BACKGROUND ruxsatini talab qiladi. Ilova fon rejimiga o'tganda tinglovchini ro'yxatdan o'tkazishni bekor qiling — bu qurilmaning ishlash muddatini uzaytiradi.

To'pli qayta ishlash va FIFO buferi

registerListener(listener, sensor, delay, maxReportLatencyUs) usuli orqali to'pli qayta ishlashdan foydalaning. maxReportLatencyUs parametri hodisalarni yetkazib berishdagi maksimal kechikishni mikrosekundlarda belgilaydi. 1000000 (1 soniya) qiymatida hodisalar sensorning FIFO buferida to'planadi va soniyada bir marta yetkaziladi — protsessor uyqudan kamroq chiqadi.

Tez-tez beriladigan savollar

Barcha Android qurilmalarida qanday sensorlar bor?

Minimal to'plam — akselerometr va magnitometr. Bu ikki sensor qurilmalarning 95% dan ortig'ida mavjud. Giroskop, yorug'lik sensori va yaqinlik sensori — zamonaviy modellarning 70–80% ida. Qolgan sensorlar (bosim, harorat, namlik, qadam o'lchagich) kamroq uchraydi va qurilmaning narx toifasiga bog'liq.

TYPE_ACCELEROMETER va TYPE_LINEAR_ACCELERATION o'rtasidagi farq nima?

TYPE_ACCELEROMETER tortishish kuchini ham o'z ichiga olgan to'liq tezlanishni qaytaradi (9.8 m/s²). TYPE_LINEAR_ACCELERATION tortishishsiz tezlanishni — faqat qurilma harakatidan kelib chiqadigan tezlanishni qaytaradi. Agar qurilma harakatsiz yotsa, akselerometr Z o'qi bo'yicha 9.8 m/s² ko'rsatadi, Linear Acceleration esa barcha o'qlarda 0 ko'rsatadi.

Qurilmada kerakli sensor bor yoki yo'qligini qanday tekshirish mumkin?

getPackageManager().hasSystemFeature() dan tegishli konstantalar bilan foydalaning: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY va boshqalar. Muqobil usul — getDefaultSensor(type) ni chaqirish va natijani null ga tekshirish. Birinchi usul ishga tushirish bosqichida tekshirish uchun afzal.

Nima uchun sensor qiymatlari sakraydi va ularni qanday tekislash mumkin?

Sensorlardan olingan xom ma'lumotlar shovqinni o'z ichiga oladi. Tekislash uchun past o'tkazuvchan (low-pass) filtr dan foydalaning: newValue = alpha * rawValue + (1 — alpha) * previousValue. Alpha = 0.1–0.3 koeffitsienti sezgirlik va silliqlik o'rtasida yaxshi muvozanat beradi. Giroskop uchun nol driftini olib tashlash uchun yuqori o'tkazuvchan (high-pass) filtr ham qo'llaniladi.

Sensorlardan fon rejimida foydalanish mumkinmi?

Ha, lekin cheklovlar bilan. Android 8.0 dan boshlab, sensor hodisalarining chastotasi fon ilovalari uchun kamaytiriladi. Android 12 dan boshlab, fonda sensorlarga kirish uchun BODY_SENSORS_BACKGROUND ruxsati talab qilinadi. Fon ishi uchun bildirishnoma bilan Foreground Service dan foydalanish tavsiya etiladi.

Xulosa

  • Sensors API — SensorManager orqali qurilmaning apparat sensorlaridan ma'lumot olish uchun yagona Android interfeysi.
  • Uch toifa — Motion (akselerometr, giroskop), Position (magnitometr) va Environment (yorug'lik, bosim) turli ishlash printsiplari va qo'llanishlari bilan.
  • Virtual sensorlar — Gravity, Linear Acceleration va Rotation Vector jismoniy sensorlar ma'lumotlarining birlashmasiga asoslangan va apparat analogiga ega emas.
  • Optimallashtirish — to'g'ri kechikish tanlash (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) va to'pli qayta ishlash energiya sarfini 60% gacha kamaytiradi.
  • Cheklovlar — Android 8+ fonda sensor chastotasini kamaytiradi, Android 12+ fon kirishi uchun BODY_SENSORS_BACKGROUND talab qiladi.
  • Asosiy tekshirish — tinglovchini ro'yxatdan o'tkazishdan oldin sensor mavjudligini getDefaultSensor yoki hasSystemFeature orqali tekshiring.
  • Shovqinni tekislash uchun low-pass filtr dan foydalaning va batareyani tejash uchun fonda tinglovchini ro'yxatdan o'tkazishni bekor qiling.

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing