Sebagian besar perangkat Android memiliki sensor bawaan yang mengukur gerakan, orientasi, dan berbagai kondisi lingkungan. Sensor ini mampu menyediakan data mentah dengan presisi dan akurasi tinggi, dan berguna jika Anda ingin memantau pergerakan atau pemosisi perangkat tiga dimensi, atau memantau perubahan di lingkungan sekitar di dekat perangkat. Misalnya, game mungkin melacak pembacaan dari sensor gravitasi perangkat untuk menyimpulkan gerakan dan gestur pengguna yang kompleks, seperti kemiringan, goyangan, rotasi, atau ayunan. Demikian pula, aplikasi cuaca mungkin menggunakan sensor suhu dan sensor kelembapan perangkat untuk menghitung dan melaporkan titik embun, atau aplikasi perjalanan mungkin menggunakan sensor medan geomagnetik dan akselerometer untuk melaporkan arah kompas.
Lihat referensi terkait berikut ini:
Platform Android mendukung tiga kategori sensor yang luas:
- Sensor gerakan
Sensor ini mengukur gaya akselerasi dan gaya rotasi pada tiga sumbu. Kategori ini mencakup akselerometer, sensor gravitasi, giroskop, dan sensor vektor rotasi.
- Sensor lingkungan
Sensor ini mengukur berbagai parameter lingkungan, seperti suhu dan tekanan udara sekitar, pencahayaan, serta kelembapan. Kategori ini mencakup barometer, fotometer, dan termometer.
- Sensor posisi
Sensor ini mengukur posisi fisik perangkat. Kategori ini mencakup sensor orientasi dan magnetometer.
Anda dapat mengakses sensor yang tersedia di perangkat dan memperoleh data sensor mentah menggunakan framework sensor Android. Framework sensor menyediakan beberapa class dan antarmuka yang membantu Anda melakukan berbagai tugas terkait sensor. Contohnya, Anda dapat menggunakan framework sensor untuk melakukan hal berikut:
- Menentukan sensor yang tersedia di perangkat.
- Menentukan kemampuan sensor individual, seperti rentang maksimum, produsen, persyaratan daya, dan resolusinya.
- Mendapatkan data sensor mentah dan menentukan kecepatan minimum saat Anda mendapatkan data sensor.
- Mendaftarkan dan membatalkan pendaftaran pemroses peristiwa sensor yang memantau perubahan sensor.
Topik ini memberikan ringkasan sensor yang tersedia di platform Android. Topik ini juga memberikan pengantar tentang framework sensor.
Pengantar Sensor
Framework sensor Android memungkinkan Anda mengakses berbagai jenis sensor. Beberapa sensor ini berbasis hardware dan beberapa berbasis software. Sensor berbasis hardware adalah komponen fisik yang di-build ke dalam perangkat handset atau tablet. Sensor tersebut mengambil data dengan mengukur langsung properti lingkungan spesifik, seperti akselerasi, kekuatan medan geomagnetik, atau perubahan sudut. Sensor berbasis software bukanlah perangkat fisik, meskipun perangkat tersebut meniru sensor berbasis hardware. Sensor berbasis software mengambil datanya dari satu atau beberapa sensor berbasis hardware dan terkadang disebut sensor virtual atau sensor sintetis. Sensor akselerasi linear dan sensor gravitasi adalah contoh sensor berbasis software. Tabel 1 merangkum sensor yang didukung oleh platform Android.
Hanya sedikit perangkat Android yang memiliki semua jenis sensor. Misalnya, sebagian besar perangkat handset dan tablet memiliki akselerometer dan magnetometer, tetapi sedikit perangkat yang memiliki barometer atau termometer. Selain itu, perangkat dapat memiliki lebih dari satu sensor dari jenis tertentu. Misalnya, perangkat dapat memiliki dua sensor gravitasi, masing-masing dengan rentang yang berbeda.
Sensor | Jenis | Deskripsi | Penggunaan Umum |
---|---|---|---|
TYPE_ACCELEROMETER |
Hardware | Mengukur gaya akselerasi dalam m/s2 yang diterapkan di perangkat pada ketiga sumbu fisik (x, y, dan z), termasuk gaya gravitasi. | Deteksi gerakan (goyangan, kemiringan, dll.). |
TYPE_AMBIENT_TEMPERATURE |
Hardware | Mengukur suhu ruangan sekitar dalam derajat Celcius (°C). Lihat catatan di bawah. | Memantau suhu udara. |
TYPE_GRAVITY |
Software atau Hardware | Mengukur gaya gravitasi dalam m/s2 yang diterapkan di perangkat pada ketiga sumbu fisik (x, y, z). | Deteksi gerakan (goyangan, kemiringan, dll.). |
TYPE_GYROSCOPE |
Hardware | Mengukur laju rotasi perangkat dalam rad/s di sekitar setiap tiga sumbu fisik (x, y, dan z). | Deteksi rotasi (berputar, berbalik, dll.). |
TYPE_LIGHT |
Hardware | Mengukur level cahaya sekitar (pencahayaan) dalam lx. | Mengontrol kecerahan layar. |
TYPE_LINEAR_ACCELERATION |
Software atau Hardware | Mengukur gaya akselerasi dalam m/s2 yang diterapkan ke perangkat pada ketiga sumbu fisik (x, y, dan z), tidak termasuk gaya gravitasi. | Memantau akselerasi sepanjang sumbu tunggal. |
TYPE_MAGNETIC_FIELD |
Hardware | Mengukur medan geomagnetik sekitar untuk ketiga sumbu fisik (x, y, z) dalam μT. | Membuat kompas. |
TYPE_ORIENTATION |
Software | Mengukur derajat rotasi yang dibuat perangkat di sekitar ketiga sumbu fisik (x, y, z).
Mulai API level 3, Anda dapat memperoleh matriks kemiringan dan matriks rotasi untuk
perangkat menggunakan sensor gravitasi dan sensor medan geomagnetik bersama dengan
metode getRotationMatrix() . |
Menentukan posisi perangkat. |
TYPE_PRESSURE |
Hardware | Mengukur tekanan udara sekitar dalam hPa atau mbar. | Memantau perubahan tekanan udara. |
TYPE_PROXIMITY |
Hardware | Mengukur kedekatan objek dalam cm sesuai dengan layar tampilan perangkat. Sensor ini biasanya digunakan untuk menentukan apakah suatu handset ditahan di telinga seseorang. | Posisi telepon selama panggilan. |
TYPE_RELATIVE_HUMIDITY |
Hardware | Mengukur kelembapan udara relatif dalam persen (%). | Memantau kelembapan relatif, mutlak dan titik embun. |
TYPE_ROTATION_VECTOR |
Software atau Hardware | Mengukur orientasi perangkat dengan memberikan tiga elemen vektor rotasi perangkat. | Deteksi gerakan dan deteksi rotasi. |
TYPE_TEMPERATURE |
Hardware | Mengukur suhu perangkat dalam derajat Celcius (°C). Penerapan
sensor ini bervariasi antarperangkat dan
sensor ini diganti dengan sensor TYPE_AMBIENT_TEMPERATURE di
API Level 14 |
Memantau suhu. |
Framework Sensor
Anda dapat mengakses sensor ini dan mendapatkan data mentah sensor dengan framework sensor Android.
Framework sensor adalah bagian dari paket android.hardware
dan mencakup class
dan antarmuka berikut:
SensorManager
- Anda dapat menggunakan class ini untuk membuat instance layanan sensor. Class ini menyediakan berbagai metode untuk mengakses dan mencantumkan sensor, mendaftarkan dan membatalkan pendaftaran pemroses peristiwa sensor, serta mendapatkan informasi orientasi. Class ini juga menyediakan beberapa konstanta sensor yang digunakan untuk melaporkan akurasi sensor, menetapkan kecepatan akuisisi data, dan mengalibrasi sensor.
Sensor
- Anda dapat menggunakan class ini untuk membuat instance sensor spesifik. Class ini menyediakan berbagai metode yang memungkinkan Anda menentukan kemampuan sensor.
SensorEvent
- Sistem menggunakan class ini untuk membuat objek peristiwa sensor, yang memberikan informasi tentang peristiwa sensor. Objek peristiwa sensor mencakup informasi berikut: data sensor mentah, jenis sensor yang menghasilkan peristiwa, akurasi data, dan stempel waktu untuk peristiwa.
SensorEventListener
- Anda dapat menggunakan antarmuka ini untuk membuat dua metode callback yang menerima notifikasi (peristiwa sensor) saat nilai sensor berubah atau saat akurasi sensor berubah.
Di aplikasi biasa, Anda menggunakan API terkait sensor ini untuk melakukan dua tugas dasar:
- Mengidentifikasi sensor dan kemampuan sensor
Mengidentifikasi sensor dan kemampuan sensor saat waktu proses akan berguna jika aplikasi Anda memiliki fitur yang bergantung pada jenis atau kemampuan sensor spesifik. Misalnya, Anda mungkin ingin mengidentifikasi semua sensor yang ada di perangkat dan menonaktifkan fitur aplikasi apa pun yang bergantung pada sensor yang tidak ada. Demikian juga, Anda mungkin ingin mengidentifikasi semua sensor dari jenis tertentu sehingga Anda dapat memilih penerapan sensor yang memiliki performa optimal untuk aplikasi Anda.
- Memantau peristiwa sensor
Memantau aktivitas sensor adalah cara mendapatkan data sensor mentah. Peristiwa sensor terjadi setiap kali sensor mendeteksi perubahan parameter yang sedang diukur. Peristiwa sensor memberikan empat informasi kepada Anda: nama sensor yang memicu peristiwa, stempel waktu untuk peristiwa, akurasi peristiwa, dan data sensor mentah yang memicu peristiwa tersebut.
Ketersediaan Sensor
Meskipun ketersediaan sensor bervariasi dari satu perangkat ke perangkat lainnya, hal ini juga dapat bervariasi antar-versi Android. Hal ini karena sensor Android telah diperkenalkan selama beberapa rilis platform. Misalnya, banyak sensor diperkenalkan di Android 1.5 (API Level 3), tetapi beberapa tidak diterapkan dan tidak tersedia untuk digunakan sampai Android 2.3 (API Level 9). Demikian juga, beberapa sensor diperkenalkan di Android 2.3 (API Level 9) dan Android 4.0 (API Level 14). Dua sensor tidak digunakan lagi dan diganti dengan sensor baru yang lebih baik.
Tabel 2 merangkum ketersediaan setiap sensor berdasarkan platform per platform. Hanya empat platform yang tercantum karena platform tersebut adalah platform yang melibatkan perubahan sensor. Sensor yang tercantum sebagai tidak digunakan lagi masih tersedia di platform berikutnya (asalkan sensor ada pada perangkat), yang sejalan dengan kebijakan kompatibilitas dengan versi Android setelahnya.
Sensor | Android 4.0 (API Level 14) |
Android 2.3 (API Level 9) |
Android 2.2 (API Level 8) |
Android 1.5 (API Level 3) |
---|---|---|---|---|
TYPE_ACCELEROMETER |
Ya | Ya | Ya | Ya |
TYPE_AMBIENT_TEMPERATURE |
Ya | t/a | t/a | t/a |
TYPE_GRAVITY |
Ya | Ya | t/a | t/a |
TYPE_GYROSCOPE |
Ya | Ya | t/a1 | t/a1 |
TYPE_LIGHT |
Ya | Ya | Ya | Ya |
TYPE_LINEAR_ACCELERATION |
Ya | Ya | t/a | t/a |
TYPE_MAGNETIC_FIELD |
Ya | Ya | Ya | Ya |
TYPE_ORIENTATION |
Ya2 | Ya2 | Ya2 | Ya |
TYPE_PRESSURE |
Ya | Ya | t/a1 | t/a1 |
TYPE_PROXIMITY |
Ya | Ya | Ya | Ya |
TYPE_RELATIVE_HUMIDITY |
Ya | t/a | t/a | t/a |
TYPE_ROTATION_VECTOR |
Ya | Ya | t/a | t/a |
TYPE_TEMPERATURE |
Ya2 | Ya | Ya | Ya |
1 Jenis sensor ini ditambahkan di Android 1.5 (API Level 3), tetapi tidak tersedia untuk digunakan sampai Android 2.3 (API Level 9).
2 Sensor ini tersedia, tetapi sudah tidak digunakan lagi.
Mengidentifikasi Sensor dan Kemampuan Sensor
Framework sensor Android menyediakan beberapa metode yang memudahkan Anda menentukan waktu proses sensor mana yang ada di perangkat. API ini juga menyediakan metode yang memungkinkan Anda menentukan kemampuan setiap sensor, seperti rentang maksimum, resolusinya, dan persyaratan dayanya.
Untuk mengidentifikasi sensor yang ada di perangkat, Anda harus mendapatkan referensi ke layanan
sensor terlebih dahulu. Untuk melakukannya, Anda perlu membuat instance dari class SensorManager
dengan
memanggil metode getSystemService()
dan meneruskan
argumen SENSOR_SERVICE
. Contoh:
Kotlin
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager
Java
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Selanjutnya, Anda bisa mendapatkan listingan setiap sensor pada perangkat dengan memanggil
metode getSensorList()
dan menggunakan konstanta TYPE_ALL
. Contoh:
Kotlin
val deviceSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_ALL)
Java
List<Sensor> deviceSensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
Jika ingin mencantumkan semua sensor dari jenis tertentu, Anda dapat menggunakan konstanta lain, selain
TYPE_ALL
seperti TYPE_GYROSCOPE
,
TYPE_LINEAR_ACCELERATION
, atau
TYPE_GRAVITY
.
Anda juga dapat menentukan apakah ada jenis sensor spesifik pada perangkat dengan menggunakan metode getDefaultSensor()
dan meneruskan konstanta
jenis untuk sensor tertentu. Jika perangkat memiliki lebih dari satu sensor jenis tertentu, salah satu
sensor harus ditetapkan sebagai sensor default. Jika sensor default tidak ada untuk jenis
sensor tertentu, pemanggilan metode akan mengembalikan null, yang berarti perangkat tidak memiliki jenis
sensor tersebut. Misalnya, kode berikut memeriksa apakah terdapat magnetometer pada perangkat:
Kotlin
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null) { // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
Java
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD) != null){ // Success! There's a magnetometer. } else { // Failure! No magnetometer. }
Catatan: Android tidak mewajibkan produsen perangkat untuk mem-build jenis sensor tertentu ke dalam perangkat Android, sehingga perangkat dapat memiliki berbagai konfigurasi sensor.
Selain mencantumkan sensor yang ada di perangkat, Anda dapat menggunakan metode publik
class Sensor
untuk menentukan kemampuan dan atribut masing-masing
sensor. Hal ini berguna jika Anda ingin aplikasi berperilaku berbeda berdasarkan sensor atau
kemampuan sensor yang tersedia di perangkat. Misalnya, Anda dapat menggunakan metode getResolution()
dan getMaximumRange()
untuk mendapatkan resolusi sensor dan rentang pengukuran maksimum. Anda juga dapat menggunakan
metode getPower()
untuk mendapatkan persyaratan daya sensor.
Dua metode umum tersebut sangat berguna jika Anda ingin mengoptimalkan aplikasi untuk
sensor dari produsen atau versi sensor yang berbeda. Misalnya, jika aplikasi Anda
perlu memantau gestur pengguna seperti kemiringan dan goyangan, Anda dapat membuat satu kumpulan aturan
pemfilteran data dan pengoptimalan untuk perangkat yang lebih baru yang memiliki sensor gravitasi vendor tertentu, dan kumpulan
lain dari aturan pemfilteran data dan pengoptimalan untuk perangkat yang tidak memiliki sensor gravitasi dan hanya memiliki
akselerometer. Contoh kode berikut menunjukkan cara menggunakan metode getVendor()
dan getVersion()
untuk melakukannya. Dalam contoh ini, kita mencari sensor gravitasi yang mencantumkan Google LLC sebagai vendor dan
memiliki nomor versi 3. Jika sensor tertentu tidak ada di perangkat, kami akan mencoba menggunakan
akselerometer.
Kotlin
private lateinit var sensorManager: SensorManager private var mSensor: Sensor? = null ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null) { val gravSensors: List<Sensor> = sensorManager.getSensorList(Sensor.TYPE_GRAVITY) // Use the version 3 gravity sensor. mSensor = gravSensors.firstOrNull { it.vendor.contains("Google LLC") && it.version == 3 } } if (mSensor == null) { // Use the accelerometer. mSensor = if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null) { sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) } else { // Sorry, there are no accelerometers on your device. // You can't play this game. null } }
Java
private SensorManager sensorManager; private Sensor mSensor; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mSensor = null; if (sensorManager.getDefaultSensor(Sensor.TYPE_GRAVITY) != null){ List<Sensor> gravSensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY); for(int i=0; i<gravSensors.size(); i++) { if ((gravSensors.get(i).getVendor().contains("Google LLC")) && (gravSensors.get(i).getVersion() == 3)){ // Use the version 3 gravity sensor. mSensor = gravSensors.get(i); } } } if (mSensor == null){ // Use the accelerometer. if (sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER) != null){ mSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } else{ // Sorry, there are no accelerometers on your device. // You can't play this game. } }
Metode lain yang berguna adalah metode getMinDelay()
,
yang menampilkan interval waktu minimum (dalam mikrodetik) yang dapat digunakan sensor untuk mendeteksi data. Setiap sensor
yang menampilkan nilai bukan nol untuk metode
getMinDelay()
adalah sensor
streaming. Sensor streaming mendeteksi data secara berkala dan diperkenalkan di Android 2.3 (API
Level 9). Jika sensor menampilkan nol saat Anda memanggil metode getMinDelay()
, artinya
sensor tersebut bukan sensor streaming karena hanya melaporkan data saat ada perubahan parameter
yang dideteksi sensor tersebut.
Metode getMinDelay()
berguna karena memungkinkan Anda menentukan tingkat maksimum saat sensor dapat memperoleh data. Jika fitur tertentu dalam aplikasi memerlukan kecepatan akuisisi data yang tinggi atau sensor streaming, Anda dapat menggunakan metode ini untuk menentukan apakah sensor memenuhi persyaratan tersebut, lalu mengaktifkan atau menonaktifkan fitur terkait di aplikasi Anda.
Perhatian: Kecepatan akuisisi data maksimum suatu sensor tidak harus berupa kecepatan di mana framework sensor menyampaikan data sensor ke aplikasi Anda. Framework sensor melaporkan data melalui peristiwa sensor, dan beberapa faktor memengaruhi kecepatan di mana aplikasi Anda menerima peristiwa sensor. Untuk informasi selengkapnya, lihat Memantau Peristiwa Sensor.
Memantau Peristiwa Sensor
Untuk memantau data sensor mentah, Anda perlu menerapkan dua metode callback yang ditampilkan melalui
antarmuka SensorEventListener
: onAccuracyChanged()
dan onSensorChanged()
. Sistem Android memanggil
metode ini setiap kali hal berikut terjadi:
- Akurasi sensor berubah.
Dalam hal ini, sistem akan memanggil metode
onAccuracyChanged()
, yang menyediakan objekSensor
yang berubah dan akurasi sensor yang baru. Akurasi direpresentasikan oleh salah satu dari empat konstanta status:SENSOR_STATUS_ACCURACY_LOW
,SENSOR_STATUS_ACCURACY_MEDIUM
,SENSOR_STATUS_ACCURACY_HIGH
, atauSENSOR_STATUS_UNRELIABLE
. - Sensor akan melaporkan nilai baru.
Dalam hal ini, sistem akan memanggil metode
onSensorChanged()
, yang menyediakan objekSensorEvent
. ObjekSensorEvent
berisi informasi tentang data sensor baru, termasuk: akurasi data, sensor yang menghasilkan data, stempel waktu saat data dihasilkan, dan data baru yang direkam sensor.
Kode berikut menunjukkan cara menggunakan metode onSensorChanged()
untuk memantau data dari
sensor cahaya. Contoh ini menampilkan data sensor mentah dalam TextView
yang
didefinisikan dalam file main.xml sebagai sensor_data
.
Kotlin
class SensorActivity : Activity(), SensorEventListener { private lateinit var sensorManager: SensorManager private var mLight: Sensor? = null public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT) } override fun onAccuracyChanged(sensor: Sensor, accuracy: Int) { // Do something here if sensor accuracy changes. } override fun onSensorChanged(event: SensorEvent) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. val lux = event.values[0] // Do something with this sensor value. } override fun onResume() { super.onResume() mLight?.also { light -> sensorManager.registerListener(this, light, SensorManager.SENSOR_DELAY_NORMAL) } } override fun onPause() { super.onPause() sensorManager.unregisterListener(this) } }
Java
public class SensorActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private Sensor mLight; @Override public final void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); mLight = sensorManager.getDefaultSensor(Sensor.TYPE_LIGHT); } @Override public final void onAccuracyChanged(Sensor sensor, int accuracy) { // Do something here if sensor accuracy changes. } @Override public final void onSensorChanged(SensorEvent event) { // The light sensor returns a single value. // Many sensors return 3 values, one for each axis. float lux = event.values[0]; // Do something with this sensor value. } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); } }
Dalam contoh ini, penundaan data default (SENSOR_DELAY_NORMAL
) ditetapkan saat metode registerListener()
dipanggil. Penundaan data (atau frekuensi pengambilan sampel) mengontrol interval saat peristiwa sensor dikirim ke aplikasi Anda melalui metode callback onSensorChanged()
. Penundaan data default cocok untuk memantau perubahan orientasi layar yang umum dan menggunakan penundaan sebesar 200.000 mikrodetik. Anda dapat menentukan penundaan data lainnya, seperti SENSOR_DELAY_GAME
(penundaan 20.000 mikrodetik), SENSOR_DELAY_UI
(penundaan 60.000 mikrodetik), atau SENSOR_DELAY_FASTEST
(penundaan 0 mikrodetik). Mulai Android 3.0 (API
Level 11), Anda juga dapat menentukan penundaan sebagai nilai mutlak (dalam mikrodetik).
Penundaan yang Anda tentukan hanya penundaan yang disarankan. Sistem Android dan aplikasi lain dapat mengubah penundaan ini. Sebagai praktik terbaik, Anda harus menentukan penundaan terbesar yang dimungkinkan karena sistem biasanya menggunakan penundaan yang lebih kecil dari yang Anda tetapkan (yaitu, Anda harus memilih frekuensi pengambilan sampel paling lambat yang masih memenuhi kebutuhan aplikasi Anda). Menggunakan penundaan yang lebih besar mengakibatkan beban yang lebih rendah pada prosesor dan oleh karena itu, daya yang digunakan akan lebih sedikit.
Tidak ada metode umum untuk menentukan kecepatan saat framework sensor mengirimkan peristiwa sensor ke aplikasi Anda; namun, Anda dapat menggunakan stempel waktu yang terkait dengan setiap peristiwa sensor untuk menghitung frekuensi pengambilan sampel pada beberapa peristiwa. Anda tidak perlu mengubah frekuensi pengambilan sampel (penundaan) setelah menetapkannya. Jika karena alasan tertentu penundaan tersebut hrus diubah, Anda harus membatalkan pendaftaran dan mendaftarkan ulang pemroses sensor.
Penting juga untuk diperhatikan bahwa contoh ini menggunakan metode callback onResume()
dan
onPause()
untuk mendaftarkan dan membatalkan pendaftaran pemroses peristiwa
sensor. Sebagai praktik terbaik, Anda harus selalu menonaktifkan sensor yang tidak diperlukan, terutama saat
aktivitas dijeda. Jika tidak dilakukan, hal ini dapat menguras daya baterai hanya dalam beberapa jam karena beberapa sensor
memiliki kebutuhan daya yang besar sehingga baterai akan cepat habis. Sistem
tidak akan otomatis menonaktifkan sensor saat layar mati.
Menangani Konfigurasi Sensor yang Berbeda
Android tidak menentukan konfigurasi sensor standar untuk perangkat, yang berarti produsen perangkat dapat menggabungkan konfigurasi sensor mana pun yang diinginkan ke perangkat Android. Akibatnya, perangkat dapat menyertakan berbagai sensor dalam berbagai konfigurasi. Jika aplikasi Anda mengandalkan jenis sensor tertentu, Anda harus memastikan bahwa sensor ada di perangkat sehingga aplikasi Anda dapat berjalan dengan baik.
Anda memiliki dua opsi untuk memastikan bahwa sensor tertentu ada di perangkat:
- Mendeteksi sensor saat waktu proses serta mengaktifkan atau menonaktifkan fitur aplikasi sebagaimana mestinya.
- Menggunakan filter Google Play untuk menargetkan perangkat dengan konfigurasi sensor spesifik.
Setiap opsi dibahas di bagian berikut.
Mendeteksi sensor pada waktu proses
Jika aplikasi Anda menggunakan jenis sensor tertentu, tetapi tidak bergantung padanya, Anda dapat menggunakan framework sensor untuk mendeteksi sensor pada waktu proses, lalu menonaktifkan atau mengaktifkan fitur aplikasi sebagaimana mestinya. Misalnya, aplikasi navigasi mungkin akan menggunakan sensor suhu, sensor tekanan, sensor GPS, dan sensor medan geomagnetik untuk menampilkan suhu, tekanan barometrik, lokasi, dan arah kompas. Jika perangkat tidak memiliki sensor tekanan, Anda dapat menggunakan framework sensor untuk mendeteksi tidak adanya sensor tekanan saat runtime, lalu menonaktifkan bagian UI aplikasi yang menampilkan tekanan. Misalnya, kode berikut memeriksa apakah ada sensor tekanan pada perangkat:
Kotlin
private lateinit var sensorManager: SensorManager ... sensorManager = getSystemService(Context.SENSOR_SERVICE) as SensorManager if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null) { // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
Java
private SensorManager sensorManager; ... sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); if (sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE) != null){ // Success! There's a pressure sensor. } else { // Failure! No pressure sensor. }
Menggunakan filter Google Play untuk menargetkan konfigurasi sensor spesifik
Jika memublikasikan aplikasi di Google Play, Anda dapat menggunakan
elemen <uses-feature>
dalam file manifes untuk memfilter aplikasi dari perangkat yang tidak
memiliki konfigurasi sensor yang sesuai untuk aplikasi Anda. Elemen
<uses-feature>
memiliki beberapa deskripsi hardware yang memungkinkan Anda memfilter
aplikasi berdasarkan keberadaan sensor tertentu. Sensor yang dapat Anda cantumkan meliputi:
akselerometer, barometer, kompas (medan geomagnetik), giroskop, cahaya, dan kedekatan. Berikut
adalah contoh entri manifes yang memfilter aplikasi yang tidak memiliki akselerometer:
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
Jika Anda menambahkan elemen dan deskripsi ini ke manifes aplikasi, pengguna akan melihat aplikasi Anda di Google Play hanya jika perangkat mereka memiliki akselerometer.
Anda harus menetapkan deskripsi ke android:required="true"
hanya jika aplikasi Anda
sepenuhnya bergantung pada sensor tertentu. Jika aplikasi Anda menggunakan sensor untuk beberapa fungsi, tetapi
tetap berjalan tanpa sensor, Anda harus mencantumkan sensor tersebut dalam elemen
<uses-feature>
, tetapi tetapkan deskripsi ke android:required="false"
. Hal ini membantu memastikan bahwa
perangkat dapat menginstal aplikasi Anda meskipun tidak memiliki sensor tertentu. Ini juga merupakan
praktik terbaik pengelolaan project yang membantu Anda melacak fitur yang digunakan aplikasi.
Perlu diingat, jika aplikasi Anda menggunakan sensor tertentu, tetapi tetap berjalan tanpa sensor,
Anda harus mendeteksi sensor pada waktu proses serta menonaktifkan atau mengaktifkan fitur aplikasi
sebagaimana mestinya.
Sistem Koordinat Sensor
Secara umum, framework sensor menggunakan sistem koordinat 3 sumbu standar untuk menyatakan nilai data. Untuk sebagian besar sensor, sistem koordinat ditentukan sesuai dengan layar perangkat saat perangkat digenggam dalam orientasi defaultnya (lihat gambar 1). Saat perangkat digenggam dalam orientasi default, sumbu X akan horizontal dan mengarah ke kanan, sumbu Y akan vertikal dan mengarah ke atas, dan sumbu Z mengarah ke bagian luar permukaan layar. Dalam sistem ini, koordinat di balik layar memiliki nilai Z negatif. Sistem koordinat ini digunakan oleh sensor berikut:
Hal terpenting yang perlu dipahami tentang sistem koordinat ini adalah bahwa sumbu tidak ditukar saat orientasi layar perangkat berubah, artinya sistem koordinat sensor tidak pernah berubah meskipun perangkat bergerak. Perilaku ini sama dengan perilaku sistem koordinat OpenGL.
Hal lain yang perlu dipahami adalah bahwa aplikasi Anda tidak boleh berasumsi bahwa orientasi alami (default) perangkat adalah potret. Orientasi alami untuk banyak perangkat tablet adalah lanskap. Dan sistem koordinat sensor selalu didasarkan pada orientasi alami perangkat.
Terakhir, jika aplikasi Anda cocok dengan data sensor pada tampilan di layar, Anda harus menggunakan
metode getRotation()
untuk menentukan rotasi layar, lalu gunakan
metode remapCoordinateSystem()
untuk memetakan
koordinat sensor ke koordinat layar. Anda harus melakukannya meskipun manifes hanya menentukan
tampilan potret.
Catatan: Beberapa sensor dan metode menggunakan sistem koordinat yang
sesuai dengan frame referensi dunia (sebagai kebalikan dari frame referensi perangkat). Sensor dan metode
ini menampilkan data yang merepresentasikan gerakan perangkat atau posisi perangkat relatif terhadap
bumi. Untuk informasi selengkapnya, lihat metode getOrientation()
, metode getRotationMatrix()
, Sensor
Orientasi, dan Sensor
Vektor Rotasi.
Pembatasan Kapasitas Sensor
Untuk melindungi informasi yang berpotensi sensitif tentang pengguna, jika aplikasi Anda menargetkan Android 12 (level API 31) atau yang lebih baru, sistem akan menempatkan pembatasan pada kecepatan refresh data dari sensor gerakan dan sensor posisi tertentu. Data ini mencakup nilai yang dicatat oleh perangkat akselerometer, giroskop, dan sensor medan geomagnetik.
Batas kecepatan refresh bergantung pada cara Anda mengakses data sensor:
- Jika Anda memanggil
metode
registerListener()
untuk memantau peristiwa sensor, frekuensi sampling sensor dibatasi hingga 200 Hz. Hal ini berlaku untuk semua varian metoderegisterListener()
yang kelebihan beban. - Jika Anda menggunakan
class
SensorDirectChannel
, frekuensi sampel sensor dibatasi hinggaRATE_NORMAL
, yang biasanya sekitar 50 Hz.
Jika aplikasi Anda perlu mengumpulkan data sensor gerakan dengan kecepatan yang lebih tinggi, Anda harus
mendeklarasikan
izin
HIGH_SAMPLING_RATE_SENSORS
, seperti yang ditunjukkan dalam cuplikan kode berikut. Jika tidak, jika aplikasi Anda mencoba mengumpulkan data sensor gerakan dengan kecepatan yang lebih tinggi tanpa menyatakan izin ini, SecurityException
akan muncul.
<manifest ...> <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/> <application ...> ... </application> </manifest>
Praktik Terbaik untuk Mengakses dan Menggunakan Sensor
Saat Anda merancang penerapan sensor, pastikan untuk mengikuti panduan yang dibahas di bagian ini. Panduan ini merupakan praktik terbaik yang direkomendasikan bagi siapa saja yang menggunakan framework sensor untuk mengakses sensor dan memperoleh data sensor.
Hanya kumpulkan data sensor di latar depan
Di perangkat yang menjalankan Android 9 (API level 28) atau yang lebih tinggi, aplikasi yang berjalan di latar belakang memiliki batasan berikut:
- Sensor yang menggunakan mode pelaporan berkelanjutan, seperti akselerometer dan giroskop, tidak menerima peristiwa.
- Sensor yang menggunakan mode pelaporan sesuai perubahan atau sekaligus tidak menerima peristiwa.
Dengan pembatasan ini, sebaiknya deteksi aktivitas sensor saat aplikasi berada di latar depan atau sebagai bagian dari layanan latar depan.
Membatalkan pendaftaran pemroses sensor
Pastikan untuk membatalkan pemroses sensor saat Anda selesai menggunakan sensor atau saat aktivitas
sensor dijeda. Jika pemroses sensor terdaftar dan aktivitasnya dijeda, sensor akan
terus memperoleh data dan menggunakan daya baterai kecuali Anda membatalkan pendaftaran sensor tersebut. Kode
berikut menunjukkan cara menggunakan metode onPause()
untuk membatalkan pendaftaran pemroses:
Kotlin
private lateinit var sensorManager: SensorManager ... override fun onPause() { super.onPause() sensorManager.unregisterListener(this) }
Java
private SensorManager sensorManager; ... @Override protected void onPause() { super.onPause(); sensorManager.unregisterListener(this); }
Untuk informasi selengkapnya, lihat unregisterListener(SensorEventListener)
.
Menguji dengan Android Emulator
Android Emulator menyertakan serangkaian kontrol sensor virtual yang memungkinkan Anda menguji sensor seperti akselerometer, suhu sekitar, magnetometer, kedekatan, cahaya, dan lainnya.
Emulator menggunakan koneksi dengan perangkat Android yang menjalankan aplikasi SdkControllerSensor. Perlu diingat bahwa aplikasi ini hanya tersedia di perangkat yang menjalankan Android 4.0 (API level 14) atau yang lebih tinggi. (Jika perangkat menjalankan Android 4.0, perangkat harus menginstal Revisi 2.) Aplikasi SdkControllerSensor memantau perubahan pada sensor di perangkat dan mengirimkannya ke emulator. Emulator ini kemudian diubah berdasarkan nilai-nilai baru yang diterima dari sensor pada perangkat Anda.
Anda dapat melihat kode sumber untuk aplikasi SdkControllerSensor di lokasi berikut:
$ your-android-sdk-directory/tools/apps/SdkController
Untuk mentransfer data antara perangkat dan emulator, ikuti langkah-langkah berikut:
- Pastikan proses debug USB diaktifkan di perangkat Anda.
- Sambungkan perangkat ke mesin pengembangan menggunakan kabel USB.
- Mulai aplikasi SdkControllerSensor di perangkat Anda.
- Dalam aplikasi tersebut, pilih sensor yang ingin Anda emulasi.
Jalankan perintah
adb
berikut:- Mulai emulator. Sekarang Anda dapat menerapkan transformasi ke emulator dengan menggerakkan perangkat.
$ adb forward tcp:1968 tcp:1968
Catatan: Jika gerakan yang Anda buat pada
perangkat fisik tidak mengubah emulator, coba jalankan
perintah adb
dari langkah 5 lagi.
Untuk informasi selengkapnya, lihat Panduan Emulator Android.
Jangan blokir metode onSensorChanged()
Data sensor dapat berubah dengan kecepatan tinggi, artinya sistem mungkin sering memanggil metode onSensorChanged(SensorEvent)
. Sebagai praktik terbaik, Anda
harus melakukan sesedikit mungkin tindakan dalam metode onSensorChanged(SensorEvent)
agar Anda tidak memblokirnya. Jika
aplikasi mengharuskan Anda melakukan pemfilteran data atau pengurangan data sensor, Anda harus melakukan
pekerjaan tersebut di luar metode onSensorChanged(SensorEvent)
.
Hindari penggunaan metode atau jenis sensor yang tidak digunakan lagi
Beberapa metode dan konstanta sudah tidak digunakan lagi.
Khususnya, jenis sensor
TYPE_ORIENTATION
sudah tidak digunakan lagi. Untuk mendapatkan data orientasi, sebaiknya gunakan getOrientation()
. Demikian pula, jenis sensor TYPE_TEMPERATURE
tidak digunakan lagi. Sebaiknya gunakan
jenis sensor TYPE_AMBIENT_TEMPERATURE
pada perangkat
yang menjalankan Android 4.0.
Verifikasi sensor sebelum menggunakannya
Selalu pastikan bahwa sensor ada di perangkat sebelum mencoba mendapatkan data darinya. Jangan asumsikan bahwa sensor ada hanya karena sensor tersebut sering digunakan. Produsen perangkat tidak diwajibkan untuk menyediakan sensor tertentu di perangkatnya.
Pilih penundaan sensor dengan cermat
Saat mendaftarkan sensor dengan metode registerListener()
, pastikan Anda memilih kecepatan pengiriman yang sesuai untuk
aplikasi atau kasus penggunaan Anda. Sensor dapat memberikan data dengan kecepatan yang sangat tinggi. Mengizinkan sistem mengirim
data tambahan yang tidak Anda perlukan dapat menyia-nyiakan resource sistem dan menghabiskan daya baterai.