ปิดเซ็นเซอร์

เมื่ออยู่ในโหมดเครื่องบิน อุปกรณ์จะยังคงเข้าถึงเซ็นเซอร์บางตัวเพื่อเปิดใช้ฟังก์ชันการทำงานบางอย่างได้ เช่น การหมุนหน้าจอและการถ่ายภาพ 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/) เป็นตัวอย่างนี้ ให้ทำตามขั้นตอนต่อไปนี้เพื่อเพิ่มการรองรับเซ็นเซอร์ใหม่

  1. ใช้อินเทอร์เฟซ BnSensorPrivacyListener ดูรายละเอียดเพิ่มเติมได้ที่ SensorPrivacyPolicy ใน CameraService.h
  2. ลงทะเบียนกับ SensorPrivacyManager และรับสถานะของการ์ดเมื่อเริ่มต้น ดูรายละเอียดเพิ่มเติมได้ที่ SensorPrivacyPolicy::registerSelf ใน CameraService.cpp
  3. จัดการการเปลี่ยนแปลงสถานะเซ็นเซอร์ปิดในการเรียกกลับ ดูรายละเอียดเพิ่มเติมได้ที่ SensorPrivacyPolicy::onSensorPrivacyChanged และ CameraService::blockAllClients ใน CameraService.cpp
  4. ป้องกันไม่ให้มีการเข้าถึงข้อมูลเซ็นเซอร์เมื่อเปิดใช้การ์ด ดูรายละเอียดเพิ่มเติมได้ที่การตรวจสอบนโยบายความเป็นส่วนตัวของเซ็นเซอร์ใน 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 ที่อ่านและแสดงเซ็นเซอร์ทั้งหมดของอุปกรณ์ เมื่อเปิดใช้การ์ดปิดเซ็นเซอร์ ให้ตรวจสอบว่าค่าของเซ็นเซอร์ไม่มีการเปลี่ยนแปลง เสียงไมโครโฟนไม่มีเสียง และเข้าถึงกล้องไม่ได้