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 callbackonSensorChanged
. - 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.
- Mengimplementasikan antarmuka
BnSensorPrivacyListener
. Untuk detail selengkapnya, lihatSensorPrivacyPolicy
diCameraService.h
. - Daftar dengan
SensorPrivacyManager
dan dapatkan status kartu saat memulai. Untuk detail selengkapnya, lihatSensorPrivacyPolicy::registerSelf
diCameraService.cpp
. - Tangani perubahan status Sensor nonaktif dalam callback. Untuk detail
selengkapnya, lihat
SensorPrivacyPolicy::onSensorPrivacyChanged
danCameraService::blockAllClients
diCameraService.cpp
. - Mencegah akses ke data sensor saat kartu diaktifkan. Untuk detail
selengkapnya, lihat pemeriksaan kebijakan privasi sensor di
CameraService::validateClientPermissionsLocked
diCameraService.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.