Sensors API: apa itu, jenis sensor dan bekerja dengan sensor

Penulis: IT Sectr Diterbitkan: 2026-03-26 Waktu membaca: 10 mnt

Sensors API — adalah antarmuka platform Android untuk mengakses sensor perangkat keras perangkat. API menyediakan cara terpadu untuk mendapatkan data dari akselerometer, giroskop, magnetometer, sensor cahaya, dan sensor lainnya. Menurut data Google, 2026, lebih dari 95% perangkat Android modern dilengkapi dengan setidaknya tiga jenis sensor, yang membuka peluang luas untuk pengembangan aplikasi kontekstual.

Poin Utama

  • Sensors API — antarmuka Android terpadu untuk bekerja dengan sensor perangkat keras perangkat.
  • Tiga kategori — sensor Motion, Position, dan Environment dengan prinsip pengukuran berbeda.
  • SensorManager — layanan sistem untuk mendapatkan daftar sensor dan mendaftarkan pendengar.
  • Frekuensi pembaruan diatur melalui konstanta SENSOR_DELAY dari NORMAL hingga FASTEST.
  • Sensor virtual — Gravity, Rotation Vector, dan Linear Acceleration didasarkan pada kombinasi sensor fisik.

Apa itu Sensors API di Android?

Sensors API — adalah antarmuka pemrograman Android Framework yang menyediakan akses kepada pengembang ke sensor perangkat keras perangkat seluler. API merupakan bagian dari Android SDK sejak versi 1.0 dan dapat diakses melalui paket android.hardware. Antarmuka ini mengabstraksi perbedaan antara implementasi sensor dari berbagai produsen — Qualcomm, MediaTek, Samsung Exynos — dan menyediakan model terpadu untuk bekerja dengan sensor.

Kemampuan utama Sensors API

API memungkinkan tiga operasi kunci: mendapatkan daftar sensor yang tersedia, mendaftarkan pendengar untuk menerima data, dan mengelola frekuensi pembaruan pembacaan. SensorManager berfungsi sebagai titik akses pusat untuk semua operasi. Sistem memberi tahu aplikasi melalui callback onSensorChanged, mengirimkan objek SensorEvent dengan array nilai float.

Evolusi Sensors API

Selama keberadaan Android, API telah melalui beberapa tahap pengembangan. Dalam versi 2.3 (Gingerbread), dukungan untuk Batch Processing muncul — pengelompokan peristiwa sensor untuk mengurangi konsumsi daya. Android 4.0 (Ice Cream Sandwich) menambahkan sensor virtual Gravity dan Linear Acceleration. Mulai Android 8.0, sistem membatasi akses latar belakang ke sensor untuk meningkatkan privasi.

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

Batasan dan persyaratan

Tidak semua perangkat memiliki set sensor yang sama. Aplikasi harus memeriksa ketersediaan sensor tertentu sebelum mendaftarkan pendengar. Emulator Android hanya mendukung set sensor terbatas — akselerometer dan magnetometer. Untuk menguji sensor lainnya, diperlukan perangkat fisik. Mulai Android 12, aplikasi harus mendeklarasikan penggunaan sensor di manifes.

Jenis sensor Android: Motion, Position, Environment

Android mengklasifikasikan semua sensor ke dalam tiga kategori: Motion (gerakan), Position (posisi), dan Environment (lingkungan). Sensor Motion meliputi akselerometer, giroskop, dan pedometer. Sensor Position mencakup magnetometer dan Orientation. Environment — sensor cahaya, tekanan, suhu, dan kelembaban.

KategoriSensorTipe (konstanta)Fisik/Virtual
MotionAkselerometerTYPE_ACCELEROMETERFisik
MotionGiroskopTYPE_GYROSCOPEFisik
MotionPedometerTYPE_STEP_COUNTERFisik
MotionGravityTYPE_GRAVITYVirtual
PositionMagnetometerTYPE_MAGNETIC_FIELDFisik
PositionRotation VectorTYPE_ROTATION_VECTORVirtual
EnvironmentCahayaTYPE_LIGHTFisik
EnvironmentTekananTYPE_PRESSUREFisik

Sensor Motion: akselerometer dan giroskop

Akselerometer mengukur percepatan dalam m/s² pada tiga sumbu — X, Y, dan Z. Nilai mencakup gravitasi (9.8 m/s² pada sumbu Z dalam keadaan diam). Giroskop mengukur kecepatan sudut dalam rad/s — kecepatan rotasi perangkat di sekitar setiap sumbu. Kombinasi kedua sensor ini digunakan dalam navigasi, game, dan aplikasi AR.

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

Sensor Position: magnetometer dan orientasi

Magnetometer (TYPE_MAGNETIC_FIELD) mengukur medan magnet dalam mikrotesla (µT) pada tiga sumbu. Digunakan sebagai kompas digital — dikombinasikan dengan akselerometer memungkinkan penentuan azimuth perangkat. Rotation Vector — sensor virtual yang menggabungkan data dari giroskop, akselerometer, dan magnetometer untuk penentuan orientasi yang akurat.

Sensor Environment: cahaya, tekanan, suhu

Sensor cahaya (TYPE_LIGHT) mengukur tingkat pencahayaan eksternal dalam lux (lx). Digunakan untuk penyesuaian kecerahan layar otomatis. Sensor tekanan (TYPE_PRESSURE) mengukur tekanan atmosfer dalam hektopaskal (hPa) — digunakan dalam aplikasi navigasi untuk menentukan ketinggian di atas permukaan laut.

Bagaimana arsitektur Sensors API bekerja

Sensors API dibangun di atas arsitektur klien-server. Aplikasi bertindak sebagai klien, SensorManager — sebagai layanan sistem Android. Ketika aplikasi mendaftarkan pendengar melalui registerListener, SensorManager terhubung ke HAL (Hardware Abstraction Layer) — driver sensor tingkat rendah yang bekerja pada level kernel Linux.

Siklus hidup peristiwa sensor

Driver HAL menerima data mentah dari chip perangkat keras, menyaring noise, dan mengirimkannya ke atas melalui stack — melalui SensorService (proses sistem) ke aplikasi. Data dikirim sebagai objek SensorEvent, berisi array nilai float values dan stempel waktu dalam nanodetik. Frekuensi peristiwa tergantung pada mode pengiriman yang dipilih.

Mode pengiriman peristiwa

Saat mendaftarkan pendengar, pengembang menentukan penundaan yang diinginkan antara peristiwa melalui konstanta SENSOR_DELAY_NORMAL (200 ms), SENSOR_DELAY_UI (60 ms), SENSOR_DELAY_GAME (20 ms), dan SENSOR_DELAY_FASTEST (0 ms — frekuensi maksimum). Frekuensi aktual mungkin berbeda — sistem mengoptimalkan konsumsi daya.

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

Pemrosesan batch (Batch Processing)

Mulai Android 2.3, sensor mendukung mode batch — peristiwa dikumpulkan dalam buffer FIFO dan dikirim dalam satu paket. Ini memungkinkan prosesor tetap dalam mode tidur lebih lama, mengurangi konsumsi daya hingga 60%. Ukuran buffer tergantung pada chip sensor dan ditunjukkan dalam bidang Sensor.fifoMaxEventCount.

Menggunakan SensorManager untuk mengakses sensor

SensorManager — layanan sistem yang dapat diakses melalui getSystemService(Context.SENSOR_SERVICE). Menyediakan metode untuk mendapatkan daftar sensor, mendapatkan sensor default tertentu, dan mendaftarkan/membatalkan pendengar. SensorManager — singleton, satu instance untuk seluruh aplikasi.

Memeriksa ketersediaan sensor

Sebelum menggunakan sensor, perlu memeriksa keberadaannya. Metode getDefaultSensor(type) mengembalikan null jika sensor tidak tersedia di perangkat. Mendapatkan null tanpa pemeriksaan akan menyebabkan NullPointerException saat mendaftarkan pendengar. Daftar semua sensor dikembalikan oleh metode getSensorList(type).

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

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

Mendaftarkan dan membatalkan pendengar

Pendengar didaftarkan melalui registerListener(listener, sensor, delay). Penting: pembatalan pendengar harus dilakukan dalam metode onPause() melalui unregisterListener(listener). Jika tidak dilakukan, aplikasi akan terus menerima peristiwa sensor, menguras baterai bahkan di latar belakang. Android 8+ menampilkan peringatan di logcat tentang pendengar yang tidak didaftarkan.

Menangani perubahan akurasi

Metode onAccuracyChanged(sensor, accuracy) dipanggil saat akurasi sensor berubah. Nilai: SENSOR_STATUS_ACCURACY_HIGH, MEDIUM, LOW, dan UNRELIABLE. Saat menerima UNRELIABLE, data sensor harus diabaikan hingga akurasi pulih. Misalnya, magnetometer memerlukan kalibrasi — menggoyangkan perangkat dalam bentuk angka delapan.

Contoh kode untuk bekerja dengan sensor di Kotlin

Mari kita lihat contoh praktis penggunaan Sensors API dalam aplikasi Android di Kotlin. Contoh pertama — menentukan orientasi layar menggunakan akselerometer. Kedua — membaca nilai magnetometer dengan kalibrasi. Ketiga — detektor langkah menggunakan pedometer.

Menentukan orientasi perangkat

Untuk menentukan orientasi, digunakan kombinasi akselerometer dan magnetometer. Metode SensorManager.getRotationMatrix() menghitung matriks rotasi, dan getOrientation() mengekstrak sudut pitch, roll, dan azimuth. Azimuth (azimut) — sudut relatif terhadap utara magnetis dalam radian.

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

Detektor langkah dengan pedometer

Pedometer (TYPE_STEP_COUNTER) mengembalikan jumlah total langkah yang dilakukan pengguna sejak perangkat terakhir di-restart. Sensor bekerja pada tingkat perangkat keras — aktif bahkan ketika aplikasi tidak berjalan. Untuk mendapatkan jumlah langkah per sesi, perlu menyimpan nilai awal dan menghitung selisihnya.

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

Kecerahan adaptif berdasarkan sensor cahaya

Sensor cahaya memungkinkan penyesuaian antarmuka dengan kondisi lingkungan. Dalam pencahayaan rendah (kurang dari 10 lx) dapat beralih ke tema gelap. Dalam sinar matahari terang (lebih dari 10000 lx) — meningkatkan kontras. Untuk menyaring noise, digunakan rata-rata bergerak dari 5 nilai terakhir.

Sensor virtual dan algoritma fusi

Android menyediakan beberapa sensor virtual yang tidak memiliki padanan perangkat keras langsung. Sensor virtual menghitung bacaannya berdasarkan kombinasi sensor fisik. Ini mengurangi beban pengembang — sistem sendiri mengimplementasikan algoritma fusi data.

Gravity dan Linear Acceleration

Sensor Gravity (TYPE_GRAVITY) memisahkan komponen gravitasi dari pembacaan akselerometer menggunakan filter low-pass. Linear Acceleration (TYPE_LINEAR_ACCELERATION) — sebaliknya, menghilangkan gravitasi dan hanya menyisakan percepatan linier perangkat. Jumlah Gravity dan Linear Acceleration memberikan pembacaan mentah akselerometer.

Rotation Vector

Rotation Vector — sensor virtual paling kompleks. Menggabungkan data dari giroskop (perubahan frekuensi tinggi), akselerometer (vektor gravitasi), dan magnetometer (orientasi relatif terhadap utara). Hasilnya — kuaternion yang menggambarkan orientasi absolut perangkat dalam ruang. Digunakan dalam aplikasi AR dan headset VR.

Game Rotation Vector

Game Rotation Vector — versi sederhana dari Rotation Vector tanpa menggunakan magnetometer. Ini memberikan akurasi penentuan azimuth yang lebih rendah, tetapi frekuensi pembaruan dan stabilitas yang lebih tinggi. Direkomendasikan untuk game di mana latensi rendah penting, bukan orientasi absolut relatif terhadap utara.

Optimasi konsumsi daya saat bekerja dengan sensor

Sensor — salah satu komponen perangkat yang paling boros energi. Akselerometer dan giroskop pada frekuensi polling maksimum dapat menguras baterai dalam 3–4 jam penggunaan terus-menerus. Mengoptimalkan pekerjaan dengan sensor adalah tugas kritis untuk aplikasi apa pun yang menggunakan Sensors API.

Memilih penundaan optimal

Jangan gunakan SENSOR_DELAY_FASTEST tanpa kebutuhan. Untuk animasi UI, SENSOR_DELAY_UI (60 ms) sudah cukup. Untuk menentukan orientasi layar — SENSOR_DELAY_NORMAL (200 ms). Semakin tinggi frekuensi, semakin banyak waktu yang dihabiskan prosesor dalam keadaan aktif. Perbedaan antara NORMAL dan FASTEST hingga 10x dalam konsumsi daya.

Membatalkan pendengar di latar belakang

Mulai Android 8.0 (API 26), aplikasi latar belakang menerima peristiwa sensor dengan frekuensi yang dikurangi. Di Android 12+, akses latar belakang ke sensor Motion dan Position memerlukan izin BODY_SENSORS_BACKGROUND. Batalkan pendaftaran pendengar saat aplikasi masuk ke mode latar belakang — ini memperpanjang masa pakai baterai perangkat.

Pemrosesan batch dan buffer FIFO

Gunakan pemrosesan batch melalui metode registerListener(listener, sensor, delay, maxReportLatencyUs). Parameter maxReportLatencyUs menentukan penundaan maksimum pengiriman peristiwa dalam mikrodetik. Pada nilai 1000000 (1 detik), peristiwa dikumpulkan dalam buffer FIFO sensor dan dikirim sekali per detik — prosesor lebih jarang keluar dari mode tidur.

Pertanyaan yang Sering Diajukan

Sensor apa yang ada di semua perangkat Android?

Set minimum — akselerometer dan magnetometer. Kedua sensor ini ada di lebih dari 95% perangkat. Giroskop, sensor cahaya, dan sensor jarak — pada 70–80% model modern. Sensor lainnya (tekanan, suhu, kelembaban, pedometer) lebih jarang ditemukan dan tergantung pada kategori harga perangkat.

Apa perbedaan antara TYPE_ACCELEROMETER dan TYPE_LINEAR_ACCELERATION?

TYPE_ACCELEROMETER mengembalikan percepatan penuh termasuk gravitasi (9.8 m/s²). TYPE_LINEAR_ACCELERATION mengembalikan percepatan tanpa gravitasi — hanya percepatan dari gerakan perangkat. Jika perangkat diam, akselerometer akan menunjukkan 9.8 m/s² pada sumbu Z, sedangkan Linear Acceleration — 0 pada semua sumbu.

Bagaimana cara memeriksa apakah perangkat memiliki sensor yang diperlukan?

Gunakan getPackageManager().hasSystemFeature() dengan konstanta yang sesuai: FEATURE_SENSOR_ACCELEROMETER, FEATURE_SENSOR_GYROSCOPE, FEATURE_SENSOR_PROXIMITY, dan lainnya. Cara alternatif — panggil getDefaultSensor(type) dan periksa hasilnya null. Cara pertama lebih disukai untuk pemeriksaan pada tahap inisialisasi.

Mengapa nilai sensor meloncat dan bagaimana cara menghaluskannya?

Data mentah dari sensor mengandung noise. Untuk menghaluskan, gunakan filter low-pass: newValue = alpha * rawValue + (1 — alpha) * previousValue. Koefisien alpha = 0.1–0.3 memberikan keseimbangan yang baik antara responsivitas dan kehalusan. Untuk giroskop, filter high-pass juga diterapkan untuk menghilangkan drift nol.

Bisakah sensor digunakan di latar belakang?

Ya, tetapi dengan batasan. Mulai Android 8.0, frekuensi peristiwa sensor dikurangi untuk aplikasi latar belakang. Mulai Android 12, izin BODY_SENSORS_BACKGROUND diperlukan untuk mengakses sensor di latar belakang. Untuk pekerjaan latar belakang, disarankan menggunakan Foreground Service dengan notifikasi.

Kesimpulan

  • Sensors API — antarmuka Android terpadu untuk mendapatkan data dari sensor perangkat keras perangkat melalui SensorManager.
  • Tiga kategori — Motion (akselerometer, giroskop), Position (magnetometer), dan Environment (cahaya, tekanan) dengan prinsip kerja dan aplikasi berbeda.
  • Sensor virtual — Gravity, Linear Acceleration, dan Rotation Vector didasarkan pada fusi data sensor fisik, tanpa padanan perangkat keras.
  • Optimasi — memilih penundaan yang tepat (SENSOR_DELAY_NORMAL, UI, GAME, FASTEST) dan menggunakan pemrosesan batch mengurangi konsumsi daya hingga 60%.
  • Batasan — Android 8+ mengurangi frekuensi sensor di latar belakang, Android 12+ memerlukan BODY_SENSORS_BACKGROUND untuk akses latar belakang.
  • Pemeriksaan dasar — sebelum mendaftarkan pendengar, periksa keberadaan sensor melalui getDefaultSensor atau hasSystemFeature.
  • Gunakan filter low-pass untuk menghaluskan noise dan batalkan pendaftaran pendengar saat masuk ke latar belakang untuk menghemat baterai.

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga