Khi ở chế độ trên máy bay, các thiết bị vẫn có thể truy cập vào một số cảm biến để kích hoạt chức năng cụ thể, chẳng hạn như xoay màn hình và chụp ảnh. Android 10 cung cấp cài đặt tùy chọn dành cho nhà phát triển để tắt tất cả các cảm biến trong thiết bị. Tính năng này giúp các nhà phát triển kiểm tra chức năng của ứng dụng trong trường hợp các cảm biến đó không hoạt động và cũng cung cấp cho người dùng cách điều khiển các cảm biến trong thiết bị của họ.
Khi nhà phát triển hoặc người dùng bật Tắt cảm biến trong tùy chọn nhà phát triển ( Cài đặt > Hệ thống > Tùy chọn nhà phát triển > Ô cài đặt nhanh dành cho nhà phát triển ), một ô mới sẽ xuất hiện trong khay cài đặt nhanh. Họ có thể sử dụng ô này để ngăn các ứng dụng truy cập vào máy ảnh, micrô và tất cả cảm biến do lớp SensorManager
quản lý.
Cảnh báo: Tùy chọn này chỉ ảnh hưởng đến các ứng dụng truy cập vào cảm biến thông qua `SensorService`, `CameraService` và `AudioPolicyService`. Các chức năng điện thoại không sử dụng `AudioPolicyService` và vẫn có quyền truy cập vào micrô trong khi gọi điện thoại.
Thực hiện
Android 10 bao gồm cách triển khai tham chiếu để xử lý các cảm biến máy ảnh, micrô và Trình SensorManager
. Dịch vụ hệ thống quản lý trạng thái tắt Cảm biến và thông báo cho khách hàng về những thay đổi trạng thái được đặt tại frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
. Trình quản lý tạo điều kiện truy cập vào SensorPrivacyService
trong ngữ cảnh của ứng dụng được đặt trong frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Nếu thiết bị của bạn sử dụng cách triển khai mặc định của SensorService
, CameraService
và AudioPolicyService
thì không cần tùy chỉnh bổ sung cho thiết kế tham chiếu. Nếu bạn có các cảm biến khác, hãy xem Tùy chỉnh để biết thêm chi tiết về cách hỗ trợ tính năng này.
Các vấn đề chung
Khi triển khai tính năng này, đôi khi các ứng dụng máy ảnh không phản hồi chính xác với lệnh gọi lại onError
, cả khi cố gắng lấy máy ảnh lần đầu tiên và khi máy ảnh không còn khả dụng. Điều này thường khiến ứng dụng gặp sự cố khi ô này được bật nhưng điều này có thể được dùng làm tín hiệu cho biết rằng tính năng này đang hoạt động như mong đợi.
Hành vi này cho thấy ứng dụng không xử lý đúng cách lệnh gọi lại onError
trong CameraDevice.StateCallback
. Khi tắt Cảm biến, lệnh gọi lại onError
sẽ được gọi với CameraDevice.StateCallback.ERROR_CAMERA_DISABLED
được đặt làm giá trị lỗi. Cập nhật mọi ứng dụng của bên thứ nhất để xử lý lệnh gọi lại onError
bằng giá trị này bằng cách không thực hiện bất kỳ lệnh gọi tiếp theo nào đối với CameraDevice
cho đến khi lệnh gọi openCamera
tiếp theo thành công.
Hành vi cảm biến
Khi Tắt cảm biến được bật, cảm biến sẽ ngừng báo cáo bất kỳ dữ liệu nào cho hệ thống hoặc ứng dụng. Ứng dụng vẫn có thể yêu cầu cảm biến và đăng ký trình nghe khi Tắt cảm biến được bật , nhưng micrô sẽ trở lại trạng thái im lặng hoặc lệnh gọi lại onSensorChanged
không bao giờ được gọi cho cảm biến. Ngay sau khi ngăn xếp bị tắt, chính những người nghe đó sẽ bắt đầu nhận được đầu ra thực tế từ micrô hoặc các lệnh gọi lại dự kiến tới onSensorChanged
mà không cần thực hiện thêm bất kỳ công việc nào. Hoạt động mặc định của cảm biến im lặng như sau.
Máy ảnh
Nếu một ứng dụng đang sử dụng máy ảnh khi Tắt cảm biến được bật thì lỗi sẽ được gửi đến phương thức gọi lại onError
và CameraDevice
sẽ bị đóng.
Nếu một ứng dụng cố gắng truy cập vào máy ảnh khi Tắt cảm biến được bật thì lỗi sẽ được gửi đến phương thức gọi lại onError
.
Cái mic cờ rô
Khi Tắt cảm biến, bạn vẫn có thể truy cập vào micrô nhưng chỉ quay lại trạng thái im lặng. Nếu một ứng dụng đang sử dụng micrô khi Tắt cảm biến thì sẽ không có lỗi nào xảy ra nhưng bản ghi sẽ ở chế độ im lặng và chỉ trả về một dãy số không. Nếu Tắt cảm biến bị tắt trong khi ứng dụng vẫn đang sử dụng micrô thì dữ liệu âm thanh dự kiến sẽ được trả về.
Nếu một ứng dụng cố gắng truy cập micrô khi Tắt cảm biến được bật thì micrô sẽ chuyển sang trạng thái im lặng.
cảm biến
Khi một ứng dụng cố gắng truy cập vào các cảm biến khác khi Tắt cảm biến được bật, loại cảm biến sẽ ảnh hưởng đến hành vi mặc định:
- Cảm biến liên tục: Cảm biến ở chế độ báo cáo này sẽ dừng gửi sự kiện. Nếu một ứng dụng đang tương tác với cảm biến liên tục khi Cảm biến tắt được bật thì cảm biến sẽ không gửi dữ liệu bổ sung đến ứng dụng cho đến khi tính năng này bị tắt.
- Sự kiện xóa: Bạn có thể yêu cầu xóa cảm biến khi bật ngăn xếp và gọi lại lệnh gọi lại
onFlushComplete
để cho biết rằng quá trình xóa được yêu cầu đã hoàn tất thành công, nhưng không có sự kiện mới nào có dữ liệu cảm biến được tạo và quay trở lại lệnh gọi lạionSensorChanged
. - Sự kiện khi thay đổi: Khi bật Tắt cảm biến, không có sự kiện thay đổi mới nào được báo cáo.
- Sự kiện kích hoạt: Khi Tắt cảm biến được bật, các sự kiện kích hoạt sẽ ngừng tạo. Mọi sự kiện hiện có đều hoàn tất.
Tùy chỉnh
Nếu thiết bị của bạn sử dụng cách triển khai mặc định của SensorService
, CameraService
và AudioPolicyService
thì không cần tùy chỉnh bổ sung cho thiết kế tham chiếu. Tuy nhiên, bạn có thể hỗ trợ các cảm biến được quản lý bên ngoài SensorManager
, xóa Cảm biến khỏi thiết bị của mình hoặc thay đổi Giao diện người dùng hệ thống cho ô cài đặt nhanh của nhà phát triển hoặc biểu tượng cho ô Tắt cảm biến .
Hỗ trợ thêm cảm biến
Nếu thiết bị của bạn chứa các cảm biến được quản lý bên ngoài SensorManager
, bạn nên thêm hỗ trợ cho chúng bằng cách sử dụng SensorPrivacyService
và SensorPrivacyManager
.
Khi ô Tắt cảm biến được bật, SensorPrivacyService
sẽ gọi lệnh gọi lại một chiều cho tất cả trình nghe đã đăng ký. Khi nhận được lệnh gọi lại này, trình xử lý đã đăng ký có thể thực hiện các bước cần thiết dựa trên trạng thái của ngăn xếp. Nếu nó được bật, tất cả các kết nối hiện có có thể bị chấm dứt và trả về dữ liệu trống, đồng thời đặt cờ để ngăn các kết nối mới. Nếu nó bị tắt, cờ có thể được đặt lại để cho phép các kết nối mới. Sử dụng dịch vụ máy ảnh ( platform/frameworks/av/services/camera/libcameraservice/
) làm ví dụ, hãy làm theo các bước sau để thêm hỗ trợ cho cảm biến mới.
- Triển khai giao diện
BnSensorPrivacyListener
. Để biết thêm chi tiết, hãy xemSensorPrivacyPolicy
trongCameraService.h
. - Đăng ký với
SensorPrivacyManager
và nhận trạng thái của ô khi khởi động. Để biết thêm chi tiết, hãy xemSensorPrivacyPolicy::registerSelf
trongCameraService.cpp
. - Xử lý các thay đổi trạng thái tắt của Cảm biến trong lệnh gọi lại. Để biết thêm chi tiết, hãy xem
SensorPrivacyPolicy::onSensorPrivacyChanged
vàCameraService::blockAllClients
trongCameraService.cpp
. - Ngăn chặn quyền truy cập vào dữ liệu cảm biến khi ô được bật. Để biết thêm chi tiết, hãy xem phần kiểm tra chính sách quyền riêng tư của cảm biến trong
CameraService::validateClientPermissionsLocked
inCameraService.cpp
.
Tắt cảm biến
Là một công cụ dành cho nhà phát triển để thử nghiệm, tính năng Tắt cảm biến bị ẩn vì trước tiên người dùng phải bật chế độ nhà phát triển, sau đó chọn hiển thị ô trong cài đặt.
Nếu bạn không muốn hỗ trợ Tắt cảm biến trên thiết bị của mình, hãy xóa thẻ dịch vụ khỏi packages/apps/Settings/AndroidManifest.xml
. Nếu bạn xóa thẻ dịch vụ, ô Tắt cảm biến sẽ không có sẵn để bật từ trang ô cài đặt nhanh dành cho nhà phát triển.
Thay đổi giao diện người dùng Tắt cảm biến
Có hai thành phần có thể được tùy chỉnh cho Giao diện người dùng tắt cảm biến : biểu tượng được hiển thị cho ô cài đặt nhanh của nhà phát triển và biểu tượng được hiển thị trên thanh trạng thái khi ô được bật. Để tùy chỉnh giao diện của các biểu tượng này, hãy thay thế các tệp sau:
- Biểu tượng ô cài đặt nhanh:
packages/apps/Settings/res/drawable/tile_icon_sensors_off.xml
- Biểu tượng thanh trạng thái:
frameworks/base/packages/SystemUI/res/drawable/stat_sys_sensors_off.xml
Thẩm định
Là một công cụ tùy chọn dành cho nhà phát triển, không có thử nghiệm CTS nào cho tính năng này.
Bạn có thể kiểm tra thủ công bằng cách cài đặt một ứng dụng từ Google Play để đọc và hiển thị tất cả cảm biến của thiết bị. Khi bạn bật ô Tắt cảm biến , hãy đảm bảo rằng không có giá trị nào của cảm biến thay đổi, âm thanh micrô ở chế độ im lặng và không thể truy cập được máy ảnh.