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 setelan opsi pengembang untuk mematikan semua sensor di perangkat. Fitur ini membantu pengembang menguji fungsionalitas aplikasi mereka dalam situasi di mana sensor tersebut menjadi tidak tersedia, dan juga memberi pengguna cara untuk mengontrol sensor di perangkat mereka.

Saat pengembang atau pengguna mengaktifkan Sensor off 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 kamera, mikrofon, dan sensor SensorManager . Layanan sistem yang mengelola status Nonaktif Sensor 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 untuk 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. Ini biasanya menyebabkan aplikasi mogok saat ubin ini diaktifkan, tetapi ini dapat digunakan sebagai sinyal untuk menunjukkan bahwa fitur tersebut berperilaku seperti yang diharapkan.

Perilaku ini menunjukkan bahwa aplikasi tidak menangani panggilan balik onError dengan benar di CameraDevice.StateCallback . Saat Sensors off diaktifkan, callback 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 ke 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 nonaktif diaktifkan, tetapi keheningan dikembalikan untuk mikrofon atau panggilan balik onSensorChanged tidak pernah dipanggil untuk sensor. Segera setelah ubin dinonaktifkan, pendengar yang sama mulai menerima output aktual dari mikrofon atau panggilan balik yang diharapkan ke onSensorChanged tanpa perlu melakukan pekerjaan tambahan. Perilaku default sensor yang dibungkam adalah sebagai berikut.

Kamera

Jika aplikasi menggunakan kamera saat Sensor mati diaktifkan, kesalahan dikirim ke metode callback onError dan CameraDevice ditutup.

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

Mikropon

Saat Sensor mati diaktifkan, akses ke mikrofon masih dimungkinkan tetapi hanya keheningan yang dikembalikan. Jika aplikasi menggunakan mikrofon saat Sensor mati diaktifkan, tidak ada kesalahan yang dihasilkan, tetapi rekaman dibungkam dan hanya mengembalikan larik nol. Jika Sensor nonaktif saat aplikasi masih menggunakan mikrofon, data audio yang diharapkan akan dikembalikan.

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

Sensor

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

  • Sensor berkelanjutan: Sensor dalam mode pelaporan ini menghentikan pengiriman peristiwa. Jika aplikasi berinteraksi dengan sensor berkelanjutan saat Sensor nonaktif diaktifkan, sensor tidak akan mengirimkan data tambahan ke aplikasi hingga fitur dinonaktifkan.
  • Flush event: Sensor flush dapat diminta saat ubin diaktifkan dan callback onFlushComplete dipanggil untuk menunjukkan bahwa flush yang diminta berhasil diselesaikan, tetapi tidak ada event 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 menghasilkan. Semua acara yang ada selesai.

Kustomisasi

Jika perangkat Anda menggunakan implementasi default SensorService , CameraService , dan AudioPolicyService , maka tidak diperlukan penyesuaian tambahan untuk desain referensi. Namun, Anda dapat mendukung sensor yang dikelola di luar SensorManager , menghapus Sensor dari perangkat Anda, atau mengubah UI Sistem untuk ubin pengaturan cepat pengembang atau ikon untuk ubin Sensor tidak aktif .

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 ubin Sensor tidak aktif , SensorPrivacyService memanggil panggilan balik satu arah untuk semua pendengar terdaftar. Saat panggilan balik ini diterima, pendengar terdaftar dapat mengambil langkah-langkah yang diperlukan berdasarkan status ubin. Jika diaktifkan, semua koneksi yang ada dapat dihentikan dan mengembalikan data kosong, dan tanda ditetapkan untuk mencegah koneksi baru. Jika dinonaktifkan, tanda dapat diatur ulang untuk mengizinkan koneksi baru. Menggunakan layanan kamera ( platform/frameworks/av/services/camera/libcameraservice/ ) sebagai contoh, ikuti langkah-langkah ini untuk menambahkan dukungan untuk sensor baru.

  1. Menerapkan antarmuka BnSensorPrivacyListener . Untuk detail selengkapnya, lihat SensorPrivacyPolicy di CameraService.h .
  2. Daftar dengan SensorPrivacyManager dan dapatkan status ubin saat startup. Untuk detail selengkapnya, lihat SensorPrivacyPolicy::registerSelf di CameraService.cpp .
  3. Menangani perubahan status nonaktif Sensor 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 .

Menghapus Sensor off

Sebagai alat pengembang untuk pengujian, Sensor nonaktif disembunyikan karena pengguna harus mengaktifkan mode pengembang terlebih dahulu, lalu memilih untuk membuat ubin tersedia di pengaturan.

Jika Anda tidak ingin mendukung Sensor pada perangkat Anda, hapus tag layanan dari packages/apps/Settings/AndroidManifest.xml . Jika Anda menghapus tag layanan, ubin Sensor mati tidak akan tersedia untuk diaktifkan dari halaman ubin pengaturan cepat pengembang.

Mengubah Sensor dari UI

Ada dua elemen yang dapat disesuaikan untuk Sensor off UI: 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 menginstal 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.