Saat dalam mode pesawat, perangkat masih dapat mengakses beberapa sensor untuk mengaktifkan fungsi tertentu, seperti rotasi layar dan pengambilan gambar. Android 10 menyediakan pengaturan opsi pengembang untuk mematikan semua sensor di perangkat. Fitur ini membantu pengembang menguji fungsionalitas aplikasi mereka dalam situasi ketika sensor tersebut tidak tersedia, dan juga memberi pengguna cara untuk mengontrol sensor di perangkat mereka.
Saat pengembang atau pengguna mengaktifkan Sensor nonaktif di opsi pengembang ( Pengaturan > Sistem > Opsi pengembang > Ubin pengembang pengaturan cepat ), ubin baru akan muncul di baki pengaturan cepat. Mereka dapat menggunakan ubin untuk mencegah aplikasi mengakses kamera, mikrofon, dan semua sensor yang dikelola oleh kelas 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.
Penerapan
Android 10 menyertakan implementasi referensi yang menangani sensor kamera, mikrofon, dan SensorManager
. Layanan sistem yang mengelola status Sensor tidak aktif dan memberi tahu klien tentang perubahan status terletak di frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
. Manajer 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
, maka tidak diperlukan penyesuaian tambahan pada desain referensi. Jika Anda memiliki sensor lain, lihat Penyesuaian untuk detail selengkapnya tentang mendukung fitur ini.
Masalah umum
Saat menerapkan fitur ini, terkadang aplikasi kamera tidak merespons panggilan balik onError
dengan benar, baik saat pertama kali mencoba memperoleh kamera maupun saat kamera tidak lagi tersedia. Hal ini biasanya mengakibatkan aplikasi mogok saat ubin ini diaktifkan, namun hal ini dapat digunakan sebagai sinyal untuk menunjukkan bahwa fitur tersebut berfungsi seperti yang diharapkan.
Perilaku ini menunjukkan bahwa aplikasi tidak menangani callback onError
di CameraDevice.StateCallback
dengan benar. Saat Sensor mati diaktifkan, panggilan balik onError
dipanggil dengan CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
ditetapkan sebagai nilai kesalahan. Perbarui aplikasi pihak pertama mana pun untuk menangani panggilan balik onError
dengan nilai ini dengan tidak melakukan panggilan berikutnya terhadap CameraDevice
hingga panggilan openCamera
berikutnya berhasil.
Perilaku sensor
Saat Sensor mati diaktifkan, sensor berhenti melaporkan data apa pun ke sistem atau aplikasi. Aplikasi masih dapat meminta sensor dan mendaftarkan pendengar saat Sensor mati diaktifkan, namun keheningan akan dikembalikan untuk mikrofon atau callback onSensorChanged
tidak pernah dipanggil untuk sensor. Segera setelah ubin dinonaktifkan, pendengar yang sama mulai menerima output aktual dari mikrofon atau callback yang diharapkan ke onSensorChanged
tanpa perlu melakukan pekerjaan tambahan apa pun. Perilaku default sensor yang dibungkam adalah sebagai berikut.
Kamera
Jika aplikasi menggunakan kamera saat Sensor mati diaktifkan, kesalahan dikirim ke metode panggilan balik onError
dan CameraDevice
ditutup.
Jika aplikasi mencoba mengakses kamera saat Sensor mati diaktifkan, kesalahan dikirim ke metode panggilan balik onError
.
Mikropon
Saat Sensor mati diaktifkan, akses ke mikrofon masih dapat dilakukan namun hanya keheningan yang dikembalikan. Jika aplikasi menggunakan mikrofon saat Sensor mati diaktifkan, tidak ada kesalahan yang terjadi, namun rekaman dibungkam dan hanya mengembalikan serangkaian angka nol. Jika Sensor mati dinonaktifkan saat aplikasi masih menggunakan mikrofon, data audio yang diharapkan akan dikembalikan.
Jika aplikasi mencoba mengakses mikrofon saat Sensor mati diaktifkan, mikrofon akan kembali senyap.
Sensor
Saat aplikasi mencoba mengakses sensor lain saat Sensor mati diaktifkan, jenis sensor akan memengaruhi perilaku default:
- Sensor berkelanjutan: Sensor dalam mode pelaporan ini berhenti mengirimkan peristiwa. Jika aplikasi berinteraksi dengan sensor berkelanjutan saat Sensor mati diaktifkan, sensor tidak akan mengirimkan data tambahan ke aplikasi hingga fitur tersebut dinonaktifkan.
- Peristiwa pembilasan: Pembilasan sensor dapat diminta ketika ubin diaktifkan dan callback
onFlushComplete
dipanggil untuk menunjukkan bahwa pembilasan yang diminta berhasil diselesaikan, namun tidak ada kejadian baru dengan data sensor yang dihasilkan dan dikembalikan ke callbackonSensorChanged
. - Peristiwa saat perubahan: Saat Sensor mati diaktifkan, tidak ada peristiwa perubahan baru yang dilaporkan.
- Peristiwa pemicu: Saat Sensor mati diaktifkan, peristiwa pemicu berhenti dihasilkan. Segala event yang ada selesai.
Kustomisasi
Jika perangkat Anda menggunakan implementasi default SensorService
, CameraService
, dan AudioPolicyService
, maka tidak diperlukan penyesuaian tambahan pada desain referensi. Namun, Anda dapat mendukung sensor yang dikelola di luar SensorManager
, menghapus Sensor nonaktif dari perangkat Anda, atau mengubah UI Sistem untuk ubin pengaturan cepat pengembang atau ikon untuk ubin Sensor nonaktif .
Mendukung lebih banyak sensor
Jika perangkat Anda berisi sensor yang dikelola di luar SensorManager
, Anda harus menambahkan dukungan untuk perangkat tersebut menggunakan SensorPrivacyService
dan SensorPrivacyManager
.
Saat petak Sensor mati diaktifkan, SensorPrivacyService
akan memanggil panggilan balik satu arah untuk semua pendengar terdaftar. Ketika panggilan balik ini diterima, pendengar terdaftar dapat mengambil langkah-langkah yang diperlukan berdasarkan keadaan ubin. Jika diaktifkan, semua koneksi yang ada dapat dihentikan dan mengembalikan data kosong, dan tanda disetel untuk mencegah koneksi baru. Jika dinonaktifkan, bendera dapat diatur ulang untuk mengizinkan koneksi baru. Menggunakan layanan kamera ( platform/frameworks/av/services/camera/libcameraservice/
) sebagai contoh, ikuti langkah-langkah berikut untuk menambahkan dukungan untuk sensor baru.
- Implementasikan antarmuka
BnSensorPrivacyListener
. Untuk detail selengkapnya, lihatSensorPrivacyPolicy
diCameraService.h
. - Daftarkan ke
SensorPrivacyManager
dan dapatkan status ubin saat startup. Untuk detail selengkapnya, lihatSensorPrivacyPolicy::registerSelf
diCameraService.cpp
. - Menangani perubahan status Sensor mati dalam panggilan balik. Untuk detail selengkapnya, lihat
SensorPrivacyPolicy::onSensorPrivacyChanged
danCameraService::blockAllClients
diCameraService.cpp
. - Cegah akses ke data sensor saat ubin diaktifkan. Untuk detail selengkapnya, lihat pemeriksaan kebijakan privasi sensor di
CameraService::validateClientPermissionsLocked
diCameraService.cpp
.
Hapus Sensor mati
Sebagai alat pengembang untuk pengujian, Sensor mati disembunyikan karena pengguna harus mengaktifkan mode pengembang terlebih dahulu, lalu memilih untuk membuat ubin tersedia di pengaturan.
Jika Anda tidak ingin menonaktifkan Sensor di perangkat Anda, hapus tag layanan dari packages/apps/Settings/AndroidManifest.xml
. Jika Anda menghapus tag layanan, ubin Sensor tidak aktif tidak akan tersedia untuk diaktifkan dari halaman ubin pengaturan cepat pengembang.
Ubah Sensor dari UI
Ada dua elemen yang dapat disesuaikan untuk UI Sensor nonaktif : ikon yang ditampilkan untuk ubin pengaturan cepat pengembang dan ikon yang ditampilkan di bilah status saat ubin diaktifkan. Untuk menyesuaikan tampilan ikon-ikon ini, ganti file-file ini:
- Ikon ubin pengaturan cepat:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Ikon bilah status:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Validasi
Sebagai alat pengembang opsional, tidak ada pengujian CTS untuk fitur ini.
Anda dapat menguji secara manual dengan memasang aplikasi dari Google Play yang membaca dan menampilkan semua sensor perangkat. Saat Anda mengaktifkan ubin Sensor mati , pastikan tidak ada nilai untuk sensor yang berubah, audio mikrofon senyap, dan kamera tidak dapat diakses.