Sensor mati

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 callback onSensorChanged .
  • 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.

  1. Implementasikan antarmuka BnSensorPrivacyListener . Untuk detail selengkapnya, lihat SensorPrivacyPolicy di CameraService.h .
  2. Daftarkan ke SensorPrivacyManager dan dapatkan status ubin saat startup. Untuk detail selengkapnya, lihat SensorPrivacyPolicy::registerSelf di CameraService.cpp .
  3. Menangani perubahan status Sensor mati dalam panggilan balik. Untuk detail selengkapnya, lihat SensorPrivacyPolicy::onSensorPrivacyChanged dan CameraService::blockAllClients di CameraService.cpp .
  4. Cegah akses ke data sensor saat ubin diaktifkan. Untuk detail selengkapnya, lihat pemeriksaan kebijakan privasi sensor di CameraService::validateClientPermissionsLocked di CameraService.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.