Ringkasan Sensor

Sebagian besar perangkat Android memiliki sensor bawaan yang mengukur gerakan, orientasi, dan berbagai kondisi lingkungan. Sensor ini mampu memberikan data mentah dengan presisi dan akurasi tinggi, serta berguna jika Anda ingin memantau pergerakan atau pemosisian perangkat tiga dimensi, atau ingin memantau perubahan di lingkungan sekitar perangkat. Misalnya, game mungkin melacak pembacaan dari sensor gravitasi perangkat untuk menyimpulkan gestur dan gerakan pengguna yang kompleks, seperti miring, goyang, rotasi, atau ayun. 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.

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 masing-masing sensor, seperti jangkauan 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 terpasang pada perangkat handset atau tablet. Sensor ini memperoleh data dengan mengukur langsung properti lingkungan tertentu, seperti akselerasi, kekuatan medan geomagnetik, atau perubahan sudut. Sensor berbasis software bukanlah perangkat fisik, meskipun meniru sensor berbasis hardware. Sensor berbasis software memperoleh 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 lebih 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 memiliki rentang yang berbeda.

Tabel 1. Jenis sensor yang didukung oleh platform Android.

Sensor Jenis Deskripsi Penggunaan Umum
TYPE_ACCELEROMETER Hardware Mengukur gaya akselerasi dalam m/s2 yang diterapkan ke 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 ke perangkat pada ketiga sumbu fisik (x, y, z). Deteksi gerakan (goyangan, kemiringan, dll.).
TYPE_GYROSCOPE Hardware Mengukur laju rotasi perangkat dalam rad/dtk di sekitar masing-masing dari 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 level API 3, Anda dapat memperoleh matriks inklinasi 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 relatif terhadap layar tampilan perangkat. Sensor ini biasanya digunakan untuk menentukan apakah handset diangkat ke 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 menyediakan tiga elemen vektor rotasi perangkat. Deteksi gerakan dan deteksi rotasi.
TYPE_TEMPERATURE Hardware Mengukur suhu perangkat dalam derajat Celcius (°C). Implementasi sensor ini bervariasi di berbagai perangkat dan sensor ini diganti dengan sensor TYPE_AMBIENT_TEMPERATURE di level API 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 memperoleh informasi orientasi. Class ini juga menyediakan beberapa konstanta sensor yang digunakan untuk melaporkan akurasi sensor, menetapkan kecepatan akuisisi data, dan mengkalibrasi 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 tersebut.
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 runtime berguna jika aplikasi Anda memiliki fitur yang mengandalkan jenis atau kemampuan sensor tertentu. Misalnya, Anda mungkin ingin mengidentifikasi semua sensor yang ada di perangkat dan menonaktifkan fitur aplikasi apa pun yang mengandalkan sensor yang tidak ada. Demikian pula, Anda mungkin ingin mengidentifikasi semua sensor dari jenis tertentu sehingga Anda dapat memilih implementasi 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 pada parameter yang diukurnya. Peristiwa sensor memberi Anda empat informasi: nama sensor yang memicu peristiwa, stempel waktu untuk peristiwa, akurasi peristiwa, dan data sensor mentah yang memicu peristiwa.

Ketersediaan Sensor

Meskipun ketersediaan sensor bervariasi dari satu perangkat ke perangkat lainnya, ketersediaan sensor juga dapat bervariasi di antara versi Android. Hal ini karena sensor Android telah diperkenalkan selama beberapa rilis platform. Misalnya, banyak sensor diperkenalkan di Android 1.5 (level API 3), tetapi beberapa tidak diimplementasikan dan tidak tersedia untuk digunakan hingga Android 2.3 (level API 9). Demikian pula, beberapa sensor diperkenalkan di Android 2.3 (level API 9) dan Android 4.0 (level API 14). Dua sensor tidak digunakan lagi dan digantikan oleh sensor yang lebih baru dan lebih baik.

Tabel 2 merangkum ketersediaan setiap sensor berdasarkan platform per platform. Hanya empat platform yang tercantum karena platform tersebut melibatkan perubahan sensor. Sensor yang tercantum sebagai tidak digunakan lagi masih tersedia di platform berikutnya (asalkan sensor tersebut ada di perangkat), yang sejalan dengan kebijakan kompatibilitas maju Android.

Tabel 2. Ketersediaan sensor menurut platform.

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 (level API 3), tetapi tidak tersedia untuk digunakan hingga Android 2.3 (level API 9).

2 Sensor ini tersedia, tetapi tidak digunakan lagi.

Mengidentifikasi Sensor dan Kemampuan Sensor

Framework sensor Android menyediakan beberapa metode yang memudahkan Anda menentukan sensor yang ada di perangkat saat runtime. API ini juga menyediakan metode yang memungkinkan Anda menentukan kemampuan setiap sensor, seperti rentang maksimum, resolusi, dan kebutuhan dayanya.

Untuk mengidentifikasi sensor yang ada di perangkat, Anda harus mendapatkan referensi ke layanan sensor terlebih dahulu. Untuk melakukannya, buat instance 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 daftar setiap sensor di 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, bukan TYPE_ALL seperti TYPE_GYROSCOPE, TYPE_LINEAR_ACCELERATION, atau TYPE_GRAVITY.

Anda juga dapat menentukan apakah jenis sensor tertentu ada di perangkat dengan menggunakan metode getDefaultSensor() dan meneruskan konstanta jenis untuk sensor tertentu. Jika perangkat memiliki lebih dari satu sensor dari jenis tertentu, salah satu sensor harus ditetapkan sebagai sensor default. Jika sensor default tidak ada untuk jenis sensor tertentu, panggilan metode akan menampilkan 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 membuat jenis sensor tertentu ke dalam perangkat yang didukung Android, sehingga perangkat dapat memiliki berbagai konfigurasi sensor.

Selain mencantumkan sensor yang ada di perangkat, Anda dapat menggunakan metode publik dari class Sensor untuk menentukan kemampuan dan atribut setiap 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 kebutuhan daya sensor.

Dua metode publik sangat berguna jika Anda ingin mengoptimalkan aplikasi untuk sensor produsen yang berbeda atau versi sensor yang berbeda. Misalnya, jika aplikasi Anda perlu memantau gestur pengguna seperti memiringkan dan menggoyangkan, Anda dapat membuat satu set aturan pemfilteran data dan pengoptimalan untuk perangkat yang lebih baru yang memiliki sensor gravitasi dari vendor tertentu, dan set aturan pemfilteran data dan pengoptimalan lainnya 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(), berarti sensor tersebut bukan sensor streaming karena hanya melaporkan data saat ada perubahan pada parameter yang dideteksinya.

Metode getMinDelay() berguna karena memungkinkan Anda menentukan kecepatan maksimum sensor dalam memperoleh data. Jika fitur tertentu dalam aplikasi Anda memerlukan tingkat akuisisi data yang tinggi atau sensor streaming, Anda dapat menggunakan metode ini untuk menentukan apakah sensor memenuhi persyaratan tersebut, lalu mengaktifkan atau menonaktifkan fitur yang relevan di aplikasi Anda.

Perhatian: Kecepatan akuisisi data maksimum sensor belum tentu merupakan kecepatan framework sensor dalam mengirimkan data sensor ke aplikasi Anda. Framework sensor melaporkan data melalui peristiwa sensor, dan beberapa faktor memengaruhi kecepatan aplikasi Anda menerima peristiwa sensor. Untuk informasi selengkapnya, lihat Memantau Peristiwa Sensor.

Memantau Peristiwa Sensor

Untuk memantau data sensor mentah, Anda perlu mengimplementasikan dua metode callback yang diekspos melalui antarmuka SensorEventListener: onAccuracyChanged() dan onSensorChanged(). Sistem Android memanggil metode ini setiap kali hal berikut terjadi:

Kode berikut menunjukkan cara menggunakan metode onSensorChanged() untuk memantau data dari sensor cahaya. Contoh ini menampilkan data sensor mentah dalam TextView yang ditentukan 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 sampling) mengontrol interval pengiriman peristiwa sensor ke aplikasi Anda melalui metode callback onSensorChanged(). Penundaan data default cocok untuk memantau perubahan orientasi layar standar dan menggunakan penundaan 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 absolut (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 Anda bisa karena sistem biasanya menggunakan penundaan yang lebih kecil daripada yang Anda tentukan (yaitu, Anda harus memilih frekuensi sampling paling lambat yang masih memenuhi kebutuhan aplikasi Anda). Menggunakan penundaan yang lebih besar akan mengurangi beban pada prosesor sehingga menggunakan lebih sedikit daya.

Tidak ada metode publik untuk menentukan kecepatan framework sensor dalam mengirim peristiwa sensor ke aplikasi Anda; namun, Anda dapat menggunakan stempel waktu yang terkait dengan setiap peristiwa sensor untuk menghitung frekuensi sampling pada beberapa peristiwa. Anda tidak perlu mengubah frekuensi sampling (penundaan) setelah menetapkannya. Jika karena alasan tertentu Anda perlu mengubah penundaan, 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 Anda dijeda. Jika tidak, baterai dapat habis hanya dalam beberapa jam karena beberapa sensor memiliki kebutuhan daya yang besar dan dapat menghabiskan daya baterai dengan cepat. Sistem tidak akan menonaktifkan sensor secara otomatis saat layar nonaktif.

Menangani Konfigurasi Sensor yang Berbeda

Android tidak menentukan konfigurasi sensor standar untuk perangkat, yang berarti produsen perangkat dapat menggabungkan konfigurasi sensor apa pun yang mereka inginkan ke dalam perangkat yang didukung Android. Oleh karena itu, perangkat dapat menyertakan berbagai sensor dalam berbagai konfigurasi. Jika aplikasi Anda mengandalkan jenis sensor tertentu, Anda harus memastikan bahwa sensor tersebut ada di perangkat agar 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 mengandalkannya, Anda dapat menggunakan framework sensor untuk mendeteksi sensor saat runtime, lalu menonaktifkan atau mengaktifkan fitur aplikasi sebagaimana mestinya. Misalnya, aplikasi navigasi mungkin 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 deskriptor 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 deskriptor ini ke manifes aplikasi, pengguna akan melihat aplikasi Anda di Google Play hanya jika perangkat mereka memiliki akselerometer.

Anda harus menetapkan deskriptor ke android:required="true" hanya jika aplikasi Anda bergantung sepenuhnya pada sensor tertentu. Jika aplikasi Anda menggunakan sensor untuk beberapa fungsi, tetapi tetap berjalan tanpa sensor, Anda harus mencantumkan sensor dalam elemen <uses-feature>, tetapi tetapkan deskriptor ke android:required="false". Hal ini membantu memastikan bahwa perangkat dapat menginstal aplikasi Anda meskipun tidak memiliki sensor tertentu. Hal ini juga merupakan praktik terbaik pengelolaan project yang membantu Anda melacak fitur yang digunakan aplikasi. Perlu diingat, jika aplikasi Anda menggunakan sensor tertentu, tetapi masih berjalan tanpa sensor, Anda harus mendeteksi sensor saat runtime dan 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 relatif terhadap layar perangkat saat perangkat dipegang dalam orientasi defaultnya (lihat gambar 1). Saat perangkat dipegang dalam orientasi defaultnya, sumbu X horizontal dan mengarah ke kanan, sumbu Y vertikal dan mengarah ke atas, dan sumbu Z mengarah ke luar permukaan layar. Dalam sistem ini, koordinat di belakang layar memiliki nilai Z negatif. Sistem koordinat ini digunakan oleh sensor berikut:

Gambar 1. Sistem koordinat (relatif terhadap perangkat) yang digunakan oleh Sensor API.

Hal terpenting yang perlu dipahami tentang sistem koordinat ini adalah bahwa sumbu tidak ditukar saat orientasi layar perangkat berubah—yaitu, sistem koordinat sensor tidak pernah berubah saat perangkat bergerak. Perilaku ini sama dengan perilaku sistem koordinat OpenGL.

Hal lain yang perlu dipahami adalah bahwa aplikasi Anda tidak boleh mengasumsikan 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 mencocokkan data sensor dengan tampilan di layar, Anda harus menggunakan metode getRotation() untuk menentukan rotasi layar, lalu menggunakan metode remapCoordinateSystem() untuk memetakan koordinat sensor ke koordinat layar. Anda harus melakukannya meskipun manifes Anda menentukan tampilan khusus potret.

Catatan: Beberapa sensor dan metode menggunakan sistem koordinat yang relatif terhadap kerangka referensi dunia (bukan kerangka referensi perangkat). Sensor dan metode ini menampilkan data yang merepresentasikan gerakan perangkat atau posisi perangkat yang relatif terhadap bumi. Untuk mengetahui informasi selengkapnya, lihat metode getOrientation(), metode getRotationMatrix(), Sensor Orientasi, dan Sensor Vektor Rotasi.

Pembatasan Kapasitas Sensor

Untuk melindungi informasi sensitif tentang pengguna, jika aplikasi Anda menargetkan Android 12 (level API 31) atau yang lebih tinggi, sistem akan membatasi kecepatan refresh data dari sensor gerakan dan sensor posisi tertentu. Data ini mencakup nilai yang dicatat oleh akselerometer, giroskop, dan sensor medan geomagnetik perangkat.

Batas kecepatan refresh bergantung pada cara Anda mengakses data sensor:

Jika aplikasi Anda perlu mengumpulkan data sensor gerakan dengan frekuensi 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 frekuensi yang lebih tinggi tanpa mendeklarasikan izin ini, SecurityException akan terjadi.

AndroidManifest.xml

<manifest ...>
    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS"/>
    <application ...>
        ...
    </application>
</manifest>

Praktik Terbaik untuk Mengakses dan Menggunakan Sensor

Saat mendesain implementasi sensor, pastikan untuk mengikuti panduan yang dibahas di bagian ini. Panduan ini adalah 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

Pada 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 on-change atau one-shot tidak menerima peristiwa.

Mengingat batasan ini, sebaiknya deteksi peristiwa sensor saat aplikasi Anda berada di latar depan atau sebagai bagian dari layanan latar depan.

Membatalkan pendaftaran pemroses sensor

Pastikan untuk membatalkan pendaftaran pemroses sensor setelah Anda selesai menggunakan sensor atau saat aktivitas sensor dijeda. Jika pemroses sensor terdaftar dan aktivitasnya dijeda, sensor akan terus memperoleh data dan menggunakan resource baterai, kecuali jika Anda membatalkan pendaftaran sensor. 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 ruangan, magnetometer, kedekatan, cahaya, dan lainnya.

Emulator menggunakan koneksi dengan perangkat Android yang menjalankan aplikasi SdkControllerSensor. Perhatikan 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 kemudian ditransformasikan berdasarkan nilai baru yang diterimanya dari sensor di 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:

  1. Pastikan proses debug USB diaktifkan di perangkat Anda.
  2. Sambungkan perangkat ke mesin pengembangan menggunakan kabel USB.
  3. Mulai aplikasi SdkControllerSensor di perangkat Anda.
  4. Dalam aplikasi tersebut, pilih sensor yang ingin Anda emulasi.
  5. Jalankan perintah adb berikut:

  6. $ adb forward tcp:1968 tcp:1968
    
  7. Mulai emulator. Sekarang Anda dapat menerapkan transformasi ke emulator dengan menggerakkan perangkat.

Catatan: Jika gerakan yang Anda lakukan pada perangkat fisik tidak mengubah emulator, coba jalankan perintah adb dari langkah 5 lagi.

Untuk informasi selengkapnya, lihat panduan Android Emulator.

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 dalam metode onSensorChanged(SensorEvent) agar 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. Secara khusus, jenis sensor TYPE_ORIENTATION tidak digunakan lagi. Untuk mendapatkan data orientasi, sebaiknya gunakan getOrientation(). Demikian pula, jenis sensor TYPE_TEMPERATURE tidak digunakan lagi. Anda harus menggunakan 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 berasumsi bahwa sensor ada hanya karena sensor tersebut sering digunakan. Produsen perangkat tidak diwajibkan untuk menyediakan sensor tertentu di perangkat mereka.

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 akan memboroskan resource sistem dan menggunakan daya baterai.