Sensor nonaktif

Saat dalam mode pesawat, perangkat masih dapat mengakses beberapa sensor untuk mengaktifkan fungsi tertentu, seperti rotasi layar dan mengambil gambar. Android 10 menyediakan setelan opsi developer untuk menonaktifkan semua sensor di perangkat. Fitur ini membantu developer menguji fungsi aplikasi mereka dalam situasi saat sensor tersebut tidak tersedia, dan juga memberi pengguna cara untuk mengontrol sensor di perangkat mereka.

Saat developer atau pengguna mengaktifkan Sensor nonaktif di opsi developer (Setelan > Sistem > Opsi developer > Kartu developer setelan cepat), kartu baru akan muncul di baki setelan cepat. Mereka dapat menggunakan kartu untuk mencegah aplikasi mengakses kamera, mikrofon, dan semua sensor yang dikelola oleh class SensorManager.

Peringatan: Opsi ini hanya memengaruhi aplikasi yang mengakses sensor melalui `SensorService`, `CameraService`, dan `AudioPolicyService`. Fungsi telepon tidak menggunakan `AudioPolicyService` dan masih memiliki akses ke mikrofon selama panggilan telepon.

Implementasi

Android 10 menyertakan implementasi referensi yang menangani sensor kamera, mikrofon, dan SensorManager. Layanan sistem yang mengelola status Sensor nonaktif dan memberi tahu klien tentang perubahan status terletak di frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java. Pengelola yang memfasilitasi akses ke SensorPrivacyService dalam konteks aplikasi terletak di frameworks/base/core/java/android/hardware/SensorPrivacyManager.java.

Jika perangkat Anda menggunakan implementasi default SensorService, CameraService, dan AudioPolicyService, tidak ada penyesuaian tambahan yang diperlukan untuk desain referensi. Jika Anda memiliki sensor lain, lihat Penyesuaian untuk mengetahui detail selengkapnya tentang dukungan fitur ini.

Masalah umum

Saat menerapkan fitur ini, terkadang aplikasi kamera tidak merespons dengan benar callback onError, baik saat pertama kali mencoba mendapatkan kamera maupun saat kamera tidak lagi tersedia. Hal ini biasanya menyebabkan aplikasi error saat kartu ini diaktifkan, tetapi hal ini dapat digunakan sebagai sinyal untuk menunjukkan bahwa fitur berperilaku seperti yang diharapkan.

Perilaku ini menunjukkan bahwa aplikasi tidak menangani callback onError dengan benar di CameraDevice.StateCallback. Saat Sensor nonaktif diaktifkan, callback onError dipanggil dengan CameraDevice.StateCallback.ERROR_CAMERA_DISABLED ditetapkan sebagai nilai error. Perbarui aplikasi pihak pertama untuk menangani callback onError dengan nilai ini dengan tidak melakukan panggilan berikutnya terhadap CameraDevice hingga panggilan openCamera berikutnya berhasil.

Perilaku sensor

Jika Sensor nonaktif diaktifkan, sensor akan berhenti melaporkan data apa pun ke sistem atau aplikasi. Aplikasi masih dapat meminta sensor dan mendaftarkan pemroses saat Sensor nonaktif diaktifkan, tetapi keheningan akan ditampilkan untuk mikrofon atau callback onSensorChanged tidak pernah dipanggil untuk sensor. Segera setelah kartu dinonaktifkan, pemroses yang sama mulai menerima output sebenarnya dari mikrofon atau callback yang diharapkan ke onSensorChanged tanpa perlu melakukan pekerjaan tambahan. Perilaku default sensor yang dibisukan adalah sebagai berikut.

Kamera

Jika aplikasi menggunakan kamera saat Sensor nonaktif diaktifkan, error akan dikirim ke metode callback onError dan CameraDevice ditutup.

Jika aplikasi mencoba mengakses kamera saat Sensor nonaktif diaktifkan, error akan dikirim ke metode callback onError.

Mikrofon

Jika Sensor nonaktif diaktifkan, akses ke mikrofon masih dapat dilakukan, tetapi hanya suara bisu yang ditampilkan. Jika aplikasi menggunakan mikrofon saat Sensor nonaktif diaktifkan, tidak akan ada error yang dihasilkan, tetapi perekaman akan dibisukan dan hanya menampilkan array nol. Jika Sensor nonaktif dinonaktifkan saat aplikasi masih menggunakan mikrofon, data audio yang diharapkan akan ditampilkan.

Jika aplikasi mencoba mengakses mikrofon saat Sensor nonaktif diaktifkan, mikrofon akan menampilkan senyap.

Sensor

Saat aplikasi mencoba mengakses sensor lain saat Sensor nonaktif diaktifkan, jenis sensor akan memengaruhi perilaku default:

  • Sensor berkelanjutan: Sensor dalam mode pelaporan ini berhenti mengirim peristiwa. Jika aplikasi berinteraksi dengan sensor berkelanjutan saat Sensor nonaktif diaktifkan, sensor tidak akan mengirimkan data tambahan ke aplikasi hingga fitur dinonaktifkan.
  • Peristiwa flush: Flush sensor dapat diminta saat kartu diaktifkan dan callback onFlushComplete dipanggil untuk menunjukkan bahwa flush yang diminta berhasil diselesaikan, tetapi tidak ada peristiwa baru dengan data sensor yang dihasilkan dan ditampilkan ke callback onSensorChanged.
  • Peristiwa sesuai perubahan: Jika Sensor nonaktif diaktifkan, tidak ada peristiwa perubahan baru yang dilaporkan.
  • Peristiwa pemicu: Jika Sensor nonaktif diaktifkan, peristiwa pemicu akan berhenti dibuat. Semua peristiwa yang ada telah selesai.

Penyesuaian

Jika perangkat Anda menggunakan implementasi default SensorService, CameraService, dan AudioPolicyService, tidak diperlukan penyesuaian tambahan pada desain referensi. Namun, Anda dapat mendukung sensor yang dikelola di luar SensorManager, menghapus Sensor nonaktif dari perangkat, atau mengubah UI Sistem untuk kartu setelan cepat developer atau ikon untuk kartu Sensor nonaktif.

Mendukung lebih banyak sensor

Jika perangkat Anda berisi sensor yang dikelola di luar SensorManager, Anda harus menambahkan dukungan untuk sensor tersebut menggunakan SensorPrivacyService dan SensorPrivacyManager.

Saat kartu Sensor nonaktif diaktifkan, SensorPrivacyService akan memanggil callback satu arah untuk semua pemroses yang terdaftar. Saat callback ini diterima, pemroses terdaftar dapat mengambil langkah-langkah yang diperlukan berdasarkan status kartu. Jika diaktifkan, semua koneksi yang ada dapat dihentikan dan menampilkan data kosong, serta tanda yang ditetapkan untuk mencegah koneksi baru. Jika dinonaktifkan, tanda ini dapat direset untuk mengizinkan koneksi baru. Dengan menggunakan layanan kamera (platform/frameworks/av/services/camera/libcameraservice/) sebagai contoh, ikuti langkah-langkah berikut untuk menambahkan dukungan bagi sensor baru.

  1. Mengimplementasikan antarmuka BnSensorPrivacyListener. Untuk detail selengkapnya, lihat SensorPrivacyPolicy di CameraService.h.
  2. Daftar dengan SensorPrivacyManager dan dapatkan status kartu saat memulai. Untuk detail selengkapnya, lihat SensorPrivacyPolicy::registerSelf di CameraService.cpp.
  3. Tangani perubahan status Sensor nonaktif dalam callback. Untuk detail selengkapnya, lihat SensorPrivacyPolicy::onSensorPrivacyChanged dan CameraService::blockAllClients di CameraService.cpp.
  4. Mencegah akses ke data sensor saat kartu diaktifkan. Untuk detail selengkapnya, lihat pemeriksaan kebijakan privasi sensor di CameraService::validateClientPermissionsLocked di CameraService.cpp.

Menghapus Sensor nonaktif

Sebagai alat developer untuk pengujian, Sensor nonaktif disembunyikan karena pengguna harus mengaktifkan mode developer terlebih dahulu, lalu memilih untuk menyediakan kartu di setelan.

Jika Anda tidak ingin mendukung Sensor nonaktif di perangkat, hapus tag layanan dari packages/apps/Settings/AndroidManifest.xml. Jika Anda menghapus tag layanan, kartu Sensor nonaktif tidak akan tersedia untuk diaktifkan dari halaman kartu setelan cepat developer.

Mengubah UI Sensor nonaktif

Ada dua elemen yang dapat disesuaikan untuk UI Sensor nonaktif: ikon yang ditampilkan untuk kartu setelan cepat developer dan ikon yang ditampilkan di status bar saat kartu diaktifkan. Untuk menyesuaikan tampilan ikon ini, ganti file berikut:

  • Ikon kartu setelan cepat: packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
  • Ikon status bar: frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml

Validasi

Sebagai alat developer opsional, tidak ada pengujian CTS untuk fitur ini.

Anda dapat menguji secara manual dengan menginstal aplikasi dari Google Play yang membaca dan menampilkan semua sensor perangkat. Saat Anda mengaktifkan kartu Sensor nonaktif, pastikan tidak ada nilai untuk sensor yang berubah, audio mikrofon tidak bersuara, dan kamera tidak dapat diakses.