Tắt cảm biến

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, CameraServiceAudioPolicyService, 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 onErrorCameraDevice 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ại onSensorChanged.
  • 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, CameraServiceAudioPolicyService, 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 SensorPrivacyServiceSensorPrivacyManager.

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.

  1. Triển khai giao diện BnSensorPrivacyListener. Để biết thêm thông tin, hãy xem SensorPrivacyPolicy trong CameraService.h.
  2. Đă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 xem SensorPrivacyPolicy::registerSelf trong CameraService.cpp.
  3. 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::onSensorPrivacyChangedCameraService::blockAllClients trong CameraService.cpp.
  4. 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 trong CameraService.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.