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 — 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.
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.
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.
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}")
}
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.
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.
| Kategori | Sensor | Tipe (konstanta) | Fisik/Virtual |
|---|---|---|---|
| Motion | Akselerometer | TYPE_ACCELEROMETER | Fisik |
| Motion | Giroskop | TYPE_GYROSCOPE | Fisik |
| Motion | Pedometer | TYPE_STEP_COUNTER | Fisik |
| Motion | Gravity | TYPE_GRAVITY | Virtual |
| Position | Magnetometer | TYPE_MAGNETIC_FIELD | Fisik |
| Position | Rotation Vector | TYPE_ROTATION_VECTOR | Virtual |
| Environment | Cahaya | TYPE_LIGHT | Fisik |
| Environment | Tekanan | TYPE_PRESSURE | Fisik |
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.
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) {}
}
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 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.
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.
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.
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.
val sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
sensorManager.registerListener(
this,
sensor,
SensorManager.SENSOR_DELAY_GAME
)
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.
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.
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).
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")
}
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.
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.
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.
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.
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())
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.
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")
}
}
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.
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.
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 — 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 — 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.
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.
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.
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.
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
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.
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.
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.
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.
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
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.
Baca juga