เมื่ออยู่ในโหมดเครื่องบิน อุปกรณ์จะยังคงเข้าถึงเซ็นเซอร์บางตัวเพื่อเปิดใช้ฟังก์ชันการทำงานบางอย่างได้ เช่น การหมุนหน้าจอและการถ่ายภาพ Android 10 มีการตั้งค่าตัวเลือกสำหรับนักพัฒนาแอปเพื่อปิดเซ็นเซอร์ทั้งหมดในอุปกรณ์ ฟีเจอร์นี้ช่วยให้นักพัฒนาแอปทดสอบฟังก์ชันการทำงานของแอปได้ในกรณีที่เซ็นเซอร์ไม่พร้อมใช้งาน และยังช่วยให้ผู้ใช้ควบคุมเซ็นเซอร์ในอุปกรณ์ได้ด้วย
เมื่อนักพัฒนาแอปหรือผู้ใช้เปิดใช้ปิดเซ็นเซอร์ในตัวเลือกสำหรับนักพัฒนาแอป (การตั้งค่า > ระบบ > ตัวเลือกสำหรับนักพัฒนาแอป > องค์ประกอบการตั้งค่าด่วนสำหรับนักพัฒนาแอป) รายการใหม่จะปรากฏในถาดการตั้งค่าด่วน โดยสามารถทำให้การ์ดนี้ป้องกันไม่ให้แอปเข้าถึงกล้อง ไมโครโฟน และเซ็นเซอร์ทั้งหมดที่จัดการโดยคลาส SensorManager
คำเตือน: ตัวเลือกนี้จะมีผลต่อแอปที่เข้าถึงเซ็นเซอร์ผ่าน "SensorService", "CameraService" และ "AudioPolicyService" เท่านั้น ฟังก์ชันการโทรจะใช้ "AudioPolicyService" ไม่ได้และยังคงเข้าถึงไมโครโฟนได้ในระหว่างการโทร
การใช้งาน
Android 10 มีการใช้งานอ้างอิงที่จัดการกล้อง ไมโครโฟน และเซ็นเซอร์ SensorManager
บริการระบบที่จัดการสถานะเซ็นเซอร์ปิดและแจ้งให้ไคลเอ็นต์ทราบถึงการเปลี่ยนแปลงสถานะอยู่ใน frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
เครื่องมือจัดการที่อำนวยความสะดวกในการเข้าถึง SensorPrivacyService
ภายในบริบทของแอปพลิเคชันจะอยู่ใน frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
หากอุปกรณ์ใช้การติดตั้งใช้งานเริ่มต้นของ SensorService
,
CameraService
และ AudioPolicyService
ก็ไม่จำเป็นต้องปรับแต่งการออกแบบอ้างอิงเพิ่มเติม หากมีเซ็นเซอร์อื่นๆ โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับการรองรับฟีเจอร์นี้ในส่วนการปรับแต่ง
ปัญหาทั่วไป
เมื่อใช้ฟีเจอร์นี้ บางครั้งแอปกล้องอาจไม่ตอบสนองต่อ onError
Callback อย่างถูกต้อง ทั้งเมื่อพยายามจับภาพกล้องเป็นครั้งแรกและเมื่อกล้องไม่พร้อมใช้งานแล้ว ซึ่งโดยทั่วไปแล้วจะทำให้แอปขัดข้องเมื่อเปิดใช้การ์ดนี้ แต่สามารถใช้เป็นสัญญาณเพื่อระบุว่าฟีเจอร์ทำงานตามที่คาดไว้
ลักษณะการทํางานนี้บ่งชี้ว่าแอปจัดการ onError
callback ใน CameraDevice.StateCallback
อย่างไม่ถูกต้อง เมื่อเปิดใช้ปิดเซ็นเซอร์ ระบบจะเรียกใช้การเรียกกลับ onError
โดยตั้งค่า CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
เป็นค่าข้อผิดพลาด อัปเดตแอปของบุคคลที่หนึ่งให้จัดการการเรียกกลับ onError
ด้วยค่านี้โดยไม่ทำการเรียกใช้ CameraDevice
เพิ่มเติมจนกว่าการเรียกใช้ openCamera
ถัดไปจะสำเร็จ
ลักษณะการทํางานของเซ็นเซอร์
เมื่อเปิดใช้เซ็นเซอร์ปิดอยู่ เซ็นเซอร์จะหยุดรายงานข้อมูลไปยังระบบหรือแอป แอปจะยังคงขอเซ็นเซอร์และลงทะเบียน Listener ได้เมื่อเปิดใช้ปิดเซ็นเซอร์ แต่ระบบจะแสดงเสียงเงียบสำหรับไมโครโฟนหรือไม่เคยเรียกใช้การเรียกกลับ onSensorChanged
สำหรับเซ็นเซอร์ ทันทีที่ปิดใช้การ์ด ผู้ฟังเดียวกันเหล่านั้นจะเริ่มได้รับเอาต์พุตจริงจากไมค์หรือคอลแบ็กที่คาดไว้จากonSensorChanged
โดยไม่ต้องดำเนินการใดๆ เพิ่มเติม ลักษณะการทำงานเริ่มต้นของเซ็นเซอร์ที่ปิดเสียงมีดังนี้
กล้อง
หากแอปใช้กล้องเมื่อเปิดใช้เซ็นเซอร์ปิดอยู่ ระบบจะส่งข้อผิดพลาดไปยังเมธอดการเรียกกลับ onError
และปิด CameraDevice
หากแอปพยายามเข้าถึงกล้องเมื่อเปิดใช้ปิดเซ็นเซอร์ ระบบจะส่งข้อผิดพลาดไปยังเมธอดการเรียกคืน onError
ไมโครโฟน
เมื่อเปิดใช้เซ็นเซอร์ปิด ระบบจะยังคงเข้าถึงไมโครโฟนได้ แต่จะแสดงเฉพาะเสียงเงียบ หากแอปใช้ไมโครโฟนเมื่อเปิดใช้เซ็นเซอร์ปิด ระบบจะไม่แสดงข้อผิดพลาด แต่การบันทึกเสียงจะถูกปิดเสียงและแสดงผลเป็นอาร์เรย์ของ 0 เท่านั้น หากปิดเซ็นเซอร์ขณะที่แอปยังคงใช้ไมโครโฟนอยู่ ระบบจะแสดงข้อมูลเสียงที่คาดไว้
หากแอปพยายามเข้าถึงไมโครโฟนเมื่อเปิดใช้เซ็นเซอร์ปิดอยู่ ไมโครโฟนจะไม่ส่งเสียงใดๆ
เซ็นเซอร์
เมื่อแอปพยายามเข้าถึงเซ็นเซอร์อื่นๆ เมื่อเปิดใช้เซ็นเซอร์ปิด ประเภทเซ็นเซอร์จะส่งผลต่อลักษณะการทำงานเริ่มต้น ดังนี้
- เซ็นเซอร์แบบต่อเนื่อง: เซ็นเซอร์ในโหมดการรายงานนี้จะหยุดส่งเหตุการณ์ หากแอปโต้ตอบกับเซ็นเซอร์แบบต่อเนื่องเมื่อเปิดใช้ปิดเซ็นเซอร์ เซ็นเซอร์จะไม่ส่งข้อมูลเพิ่มเติมไปยังแอปจนกว่าจะปิดใช้ฟีเจอร์นี้
- ล้างเหตุการณ์: คุณสามารถขอล้างข้อมูลเซ็นเซอร์ได้เมื่อเปิดใช้การ์ดและเรียกใช้การเรียกกลับ
onFlushComplete
เพื่อระบุว่าการล้างข้อมูลที่ขอเสร็จสมบูรณ์แล้ว แต่ระบบจะไม่สร้างเหตุการณ์ใหม่ที่มีข้อมูลเซ็นเซอร์และส่งกลับไปยังการเรียกกลับonSensorChanged
- เหตุการณ์เมื่อมีการเปลี่ยนแปลง: เมื่อเปิดใช้เซ็นเซอร์ปิด ระบบจะไม่รายงานเหตุการณ์การเปลี่ยนแปลงใหม่
- เหตุการณ์ทริกเกอร์: เมื่อเปิดใช้ปิดเซ็นเซอร์ ระบบจะหยุดสร้างเหตุการณ์ทริกเกอร์ กิจกรรมที่มีอยู่จะเสร็จสมบูรณ์
การปรับแต่ง
หากอุปกรณ์ใช้การติดตั้งใช้งานเริ่มต้นของ SensorService
, CameraService
และ AudioPolicyService
ก็ไม่จำเป็นต้องปรับแต่งการออกแบบอ้างอิงเพิ่มเติม อย่างไรก็ตาม คุณสามารถรองรับเซ็นเซอร์ที่จัดการนอก SensorManager
นำเซ็นเซอร์ปิดอยู่ออกจากอุปกรณ์ หรือเปลี่ยน UI ของระบบสำหรับการ์ดการตั้งค่าด่วนของนักพัฒนาแอปหรือไอคอนของการ์ดเซ็นเซอร์ปิดอยู่
รองรับเซ็นเซอร์เพิ่มเติม
หากอุปกรณ์มีเซ็นเซอร์ที่จัดการนอก SensorManager
คุณควรเพิ่มการรองรับเซ็นเซอร์เหล่านั้นโดยใช้ SensorPrivacyService
และ SensorPrivacyManager
เมื่อเปิด/ปิดการ์ดเซ็นเซอร์ปิด SensorPrivacyService
จะเรียกใช้การเรียกกลับแบบ 1 ทิศทางสําหรับโปรแกรมฟังทั้งหมดที่ลงทะเบียนไว้ เมื่อได้รับการเรียกกลับนี้ ผู้ฟังที่ลงทะเบียนไว้จะทำตามขั้นตอนที่จำเป็นโดยอิงตามสถานะของการ์ด หากเปิดใช้ ระบบจะสิ้นสุดการเชื่อมต่อที่มีอยู่ทั้งหมดและแสดงผลเป็นข้อมูลว่าง รวมถึงตั้งค่า Flag เพื่อป้องกันการต่อเชื่อมใหม่ หากปิดใช้ คุณสามารถรีเซ็ตการตั้งค่าสถานะเพื่ออนุญาตให้มีการเชื่อมต่อใหม่ได้ โดยใช้บริการกล้อง (platform/frameworks/av/services/camera/libcameraservice/
) เป็นตัวอย่างนี้ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการรองรับเซ็นเซอร์ใหม่
- ใช้อินเทอร์เฟซ
BnSensorPrivacyListener
ดูรายละเอียดเพิ่มเติมได้ที่SensorPrivacyPolicy
ในCameraService.h
- ลงทะเบียนกับ
SensorPrivacyManager
และรับสถานะของการ์ดเมื่อเริ่มต้น ดูรายละเอียดเพิ่มเติมได้ที่SensorPrivacyPolicy::registerSelf
ในCameraService.cpp
- จัดการการเปลี่ยนแปลงสถานะเซ็นเซอร์ปิดในการเรียกกลับ ดูรายละเอียดเพิ่มเติมได้ที่
SensorPrivacyPolicy::onSensorPrivacyChanged
และCameraService::blockAllClients
ในCameraService.cpp
- ป้องกันไม่ให้มีการเข้าถึงข้อมูลเซ็นเซอร์เมื่อเปิดใช้การ์ด ดูรายละเอียดเพิ่มเติมได้ที่การตรวจสอบนโยบายความเป็นส่วนตัวของเซ็นเซอร์ใน
CameraService::validateClientPermissionsLocked
ในCameraService.cpp
นำ "ปิดเซ็นเซอร์" ออก
เซ็นเซอร์ปิดอยู่จะซ่อนอยู่เนื่องจากเป็นเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์สำหรับการทดสอบ ผู้ใช้ต้องเปิดใช้โหมดนักพัฒนาซอฟต์แวร์ก่อน แล้วจึงเลือกทำให้การ์ดพร้อมใช้งานในการตั้งค่า
หากไม่ต้องการรองรับเซ็นเซอร์ปิดอยู่ในอุปกรณ์ ให้นำป้ายกำกับบริการออกจาก packages/apps/Settings/AndroidManifest.xml
หากคุณนำแท็กบริการออก คุณจะเปิดใช้การ์ดเซ็นเซอร์ปิดอยู่จากหน้าการ์ดการตั้งค่าด่วนสำหรับนักพัฒนาแอปไม่ได้
เปลี่ยน UI ของ "ปิดเซ็นเซอร์"
องค์ประกอบที่ปรับแต่งได้สำหรับ UI เซ็นเซอร์ปิดมี 2 อย่าง ได้แก่ ไอคอนที่แสดงสำหรับการ์ดการตั้งค่าด่วนของนักพัฒนาแอป และไอคอนที่แสดงในแถบสถานะเมื่อเปิดใช้การ์ด หากต้องการปรับแต่งรูปลักษณ์ของไอคอนเหล่านี้ ให้แทนที่ไฟล์ต่อไปนี้
- ไอคอนการ์ดการตั้งค่าด่วน
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- ไอคอนในแถบสถานะ
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
การตรวจสอบความถูกต้อง
เนื่องจากเป็นเครื่องมือสำหรับนักพัฒนาแอปที่ไม่บังคับ จึงไม่มีการทดสอบ CTS สำหรับฟีเจอร์นี้
คุณสามารถทดสอบด้วยตนเองโดยการติดตั้งแอปจาก Google Play ที่อ่านและแสดงเซ็นเซอร์ทั้งหมดของอุปกรณ์ เมื่อเปิดใช้การ์ดปิดเซ็นเซอร์ ให้ตรวจสอบว่าค่าของเซ็นเซอร์ไม่มีการเปลี่ยนแปลง เสียงไมโครโฟนไม่มีเสียง และเข้าถึงกล้องไม่ได้