Khi ở chế độ trên máy bay, thiết bị vẫn có thể truy cập vào một số cảm biến để bậ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 chế độ cài đặt tuỳ chọn cho nhà phát triển để tắt tất cả cảm biến trong thiết bị. Tính năng này giúp nhà phát triển kiểm thử 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, đồng thời giúp người dùng có cách kiểm soát 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 chế độ Tắt cảm biến trong tuỳ chọn cho nhà phát triển (Cài đặt > Hệ thống > Tuỳ chọn cho 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. Người dùng có thể sử dụng thẻ thông tin để ngăn ứ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: Tuỳ 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 cuộc gọi điện thoại.
Triển khai
Android 10 bao gồm một cách triển khai tham chiếu giúp xử lý máy ảnh, micrô và cảm biến SensorManager
. Dịch vụ hệ thống quản lý trạng thái Sensors off (Tắt cảm biến) và thông báo cho ứng dụng về các thay đổi trạng thái nằm trong frameworks/base/services/core/java/com/android/server/SensorPrivacyService.java
.
Trình quản lý hỗ trợ quyền truy cập vào SensorPrivacyService
trong ngữ cảnh của ứng dụng nằm trong frameworks/base/core/java/android/hardware/SensorPrivacyManager.java
.
Nếu thiết bị của bạn sử dụng phương thức triển khai mặc định của SensorService
, CameraService
và AudioPolicyService
, thì bạn không cần tuỳ chỉnh thêm thiết kế tham chiếu. Nếu bạn có các cảm biến khác, hãy xem phần Tuỳ chỉnh để biết thêm thông tin chi tiết về cách hỗ trợ tính năng này.
Các vấn đề thường gặp
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 đúng cách các lệnh gọi lại onError
, cả khi lần đầu tiên cố gắng lấy máy ảnh và khi không còn máy ảnh. Điều này thường dẫn đến việc ứng dụng gặp sự cố khi bật thẻ thông tin này, nhưng bạn có thể dùng điều này làm tín hiệu cho biết tính năng đang hoạt động như mong đợi.
Hành vi này cho biết ứng dụng không xử lý đúng cách lệnh gọi lại onError
trong CameraDevice.StateCallback
. Khi bạn bật tuỳ chọn 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 nào tiếp theo đối với CameraDevice
cho đến khi lệnh gọi openCamera
tiếp theo thành công.
Hành vi của cảm biến
Khi bạn bật chế độ Tắt cảm biến, các cảm biến sẽ ngừng báo cáo mọi dữ liệu 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 chế độ Tắt cảm biến được bật, nhưng micrô sẽ trả về âm thanh im lặng hoặc lệnh gọi lại onSensorChanged
sẽ không bao giờ được gọi cho cảm biến. Ngay khi thẻ thông tin bị tắt, các trình nghe đó sẽ bắt đầu nhận đầu ra thực tế từ micrô hoặc lệnh gọi lại dự kiến đến onSensorChanged
mà không cần làm thêm gì. Hành vi mặc định của cảm biến bị tắt tiếng như sau.
Camera
Nếu một ứng dụng đang sử dụng máy ảnh khi chế độ Tắt cảm biến đang 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 chế độ Tắt cảm biến đang bật, thì lỗi sẽ được gửi đến phương thức gọi lại onError
.
Micrô
Khi bạn bật chế độ Tắt cảm biến, ứng dụng vẫn có thể truy cập vào micrô nhưng chỉ nhận được âm thanh im lặng. Nếu một ứng dụng đang sử dụng micrô khi chế độ Tắt cảm biến đang bật, thì sẽ không có lỗi nào được tạo, nhưng bản ghi sẽ bị tắt tiếng và chỉ trả về một mảng gồm các số 0. Nếu bạn tắt chế độ Tắt cảm biến 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 vào micrô khi chế độ Tắt cảm biến đang bật, thì micrô sẽ trả về âm thanh 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 chế độ Tắt cảm biến đang 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ẽ ngừng gửi sự kiện. Nếu một ứng dụng đang tương tác với một cảm biến liên tục khi chế độ Tắt cảm biến đang bật, thì cảm biến sẽ không gửi thêm dữ liệu nào cho ứng dụng cho đến khi bạn tắt tính năng này.
- Sự kiện xả: Bạn có thể yêu cầu xả cảm biến khi thẻ thông tin được bật và lệnh gọi lại
onFlushComplete
được gọi để cho biết rằng yêu cầu xả đã 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à trả về lệnh gọi lạionSensorChanged
. - Sự kiện thay đổi: Khi bạn bật chế độ Tắt cảm biến, hệ thống sẽ không báo cáo sự kiện thay đổi mới.
- Sự kiện kích hoạt: Khi bạn bật chế độ Tắt cảm biến, 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.
Tuỳ chỉnh
Nếu thiết bị của bạn sử dụng phương thức triển khai mặc định của SensorService
, CameraService
và AudioPolicyService
, thì bạn không cần tuỳ chỉnh thêm 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
, xoá Tắt cảm biến khỏi thiết bị hoặc thay đổi giao diện người dùng hệ thống cho thẻ cài đặt nhanh dành cho nhà phát triển hoặc biểu tượng cho thẻ Tắt cảm biến.
Hỗ trợ nhiều cảm biến hơ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 tính năng hỗ trợ cho các cảm biến đó bằng cách sử dụng SensorPrivacyService
và SensorPrivacyManager
.
Khi thẻ thông tin Tắt cảm biến được bật/tắ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 nghe đã đă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 thẻ thông tin. Nếu đượ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 một cờ được đặt để ngăn chặn các kết nối mới. Nếu bị tắt, bạn có thể đặt lại cờ này để cho phép các kết nối mới. Lấy ví dụ về dịch vụ máy ảnh (platform/frameworks/av/services/camera/libcameraservice/
), hãy làm theo các bước sau để thêm tính năng hỗ trợ cho một cảm biến mới.
- Triển khai giao diện
BnSensorPrivacyListener
. Để biết thêm thông tin, hãy xemSensorPrivacyPolicy
trongCameraService.h
. - Đăng ký với
SensorPrivacyManager
và lấy trạng thái của thẻ thông tin khi khởi động. Để biết thêm thông tin, hãy xemSensorPrivacyPolicy::registerSelf
trongCameraService.cpp
. - Xử lý các thay đổi trạng thái Tắt cảm biến trong lệnh gọi lại. Để biết thêm thông tin chi tiết, hãy xem
SensorPrivacyPolicy::onSensorPrivacyChanged
vàCameraService::blockAllClients
trongCameraService.cpp
. - Ngăn quyền truy cập vào dữ liệu cảm biến khi thẻ thông tin đang bật. Để biết thêm chi tiết, hãy xem quy trình kiểm tra chính sách quyền riêng tư của cảm biến trong
CameraService::validateClientPermissionsLocked
trongCameraService.cpp
.
Xoá chế độ Tắt cảm biến
Là một công cụ dành cho nhà phát triển để kiểm thử, 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 cung cấp thẻ thông tin trong phần cài đặt.
Nếu bạn không muốn hỗ trợ chế độ Tắt cảm biến trên thiết bị, hãy xoá thẻ dịch vụ khỏi packages/apps/Settings/AndroidManifest.xml
. Nếu bạn xoá thẻ dịch vụ, thì ô Tắt cảm biến sẽ không bật được trên 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 tuỳ chỉnh cho giao diện người dùng Tắt cảm biến: biểu tượng hiển thị cho thẻ cài đặt nhanh của nhà phát triển và biểu tượng hiển thị trong thanh trạng thái khi thẻ này được bật. Để tuỳ 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
Xác nhận kết quả
Đây là một công cụ không bắt buộc dành cho nhà phát triển, nên không có quy trình kiểm thử CTS nào cho tính năng này.
Bạn có thể kiểm thử theo cách thủ công bằng cách cài đặt một ứng dụng trên Google Play có chức năng đọc và hiển thị tất cả các cảm biến của thiết bị. Khi bạn bật thẻ thông tin 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 của micrô bị tắt và không thể truy cập vào máy ảnh.