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 — 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.
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.
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.
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}")
}
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 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.
| Toifa | Sensorlar | Tur (doimiy) | Jismoniy/Virtual |
|---|---|---|---|
| Motion | Akselerometr | TYPE_ACCELEROMETER | Jismoniy |
| Motion | Giroskop | TYPE_GYROSCOPE | Jismoniy |
| Motion | Qadam o'lchagich | TYPE_STEP_COUNTER | Jismoniy |
| Motion | Gravity | TYPE_GRAVITY | Virtual |
| Position | Magnitometr | TYPE_MAGNETIC_FIELD | Jismoniy |
| Position | Rotation Vector | TYPE_ROTATION_VECTOR | Virtual |
| Environment | Yorug'lik | TYPE_LIGHT | Jismoniy |
| Environment | Bosim | TYPE_PRESSURE | Jismoniy |
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.
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) {}
}
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.
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 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.
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.
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.
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
this,
sensor,
SensorManager.SENSOR_DELAY_GAME
)
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.
SensorManager — getSystemService(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.
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.
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")
}
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.
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 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.
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.
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 (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.
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 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.
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 (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 — 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 — 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 — 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.
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.
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.
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
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 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.
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.
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.
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
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.