Trên các thiết bị có thể gập lại theo kiểu sách, bạn có thể bật tính năng hỗ trợ chế độ lều và chế độ nêm.
Chế độ lều và chế độ nêm cho phép bạn sử dụng màn hình ngoài khi thiết bị hơi mở, như minh hoạ trong hình sau:

Hình 1. Các tư thế có thể gập lại theo kiểu lều và nêm.
Ở chế độ lều, thiết bị sẽ mở một phần, sử dụng cả hai nửa để tự đỡ như một chiếc lều. Ở chế độ nêm, thiết bị sẽ được chống đỡ trên nửa bên phải, nằm phẳng trên một bề mặt.
Android 16 trở lên hỗ trợ hành vi này bằng cách sử dụng
BookStyleDeviceStatePolicy làm chính sách trạng thái thiết bị. Chính sách này hoạt động trên thiết bị có thể gập lại với hai màn hình theo kiểu sách, có bản lề nằm ở bên trái thiết bị khi gập lại.
Chính sách này giúp màn hình ngoài bật lâu hơn khi mở ra trong một số điều kiện nhất định, ví dụ:
- Nửa bên phải của thiết bị hầu hết là phẳng, cho biết rằng thiết bị có thể ở chế độ nêm.
- Hướng thiết bị là ngang ngược, cho biết rằng thiết bị có thể ở chế độ lều.
- Hướng màn hình là ngang hoặc ngang ngược.
- Có một ứng dụng giữ khoá đánh thức màn hình (ngăn màn hình hết thời gian chờ).
Chính sách này không giới thiệu trạng thái thiết bị riêng cho tư thế lều hoặc nêm; chính sách này giữ trạng thái đóng cho nhiều góc bản lề hơn trong các điều kiện cụ thể này.
Để hỗ trợ đầy đủ các phương pháp phỏng đoán này, thiết bị cần:
- Cảm biến góc bản lề báo cáo góc giữa hai nửa của thiết bị
- Cảm biến gia tốc trên mỗi nửa (trái và phải) của thiết bị
Định cấu hình chế độ lều hoặc nêm
Hãy làm theo các bước sau để bật tính năng hỗ trợ chế độ lều và nêm trên thiết bị:
Tạo một phương thức triển khai
DeviceStatePolicy.Providertrả về một thực thể củaBookStyleDeviceStatePolicy. Thực thể này phải cung cấp tất cả các phần phụ thuộc cần thiết, chẳng hạn như đối tượng cảm biến, cho hàm khởi tạoBookStyleDeviceStatePolicy.Ví dụ sau đây cho thấy một phương thức triển khai:
package com.example; public class MyDevicePolicyProvider implements DeviceStatePolicy.Provider { @Override public DeviceStatePolicy instantiate(@NonNull Context context) { final SensorManager sensorManager = context.getSystemService(SensorManager.class); final Sensor hingeAngleSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE, /* wakeUp= */ true); final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); final Sensor hallSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getStringType(), "com.example.hall_effect")); final Sensor rightAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 0")); final Sensor leftAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 1")); // You can pass a non-null value here to disable tent/wedge mode logic, // so the displays switch will always happen at the fixed hinge angle. // This might be useful, for example, when in a retail demo mode where // the hinge angle range of the device is limited. final Integer closeAngleDegrees = null; return new BookStyleDeviceStatePolicy(new FeatureFlagsImpl(), context, hingeAngleSensor, hallSensor, leftAccelerometerSensor, rightAccelerometerSensor, closeAngleDegrees); } }Thêm nhà cung cấp chính sách vào đường dẫn lớp của máy chủ hệ thống. Bắt đầu bằng cách tạo một thư viện có lớp nhà cung cấp chính sách trạng thái thiết bị mà bạn đã tạo ở bước trước.
Ví dụ sau đây cho thấy cấu hình bản thiết kế Soong
Android.bp:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }Sau đó, để thêm thư viện này vào máy chủ hệ thống, hãy sửa đổi tệp makefile của thiết bị bằng cách thêm các dòng sau:
# Add system service libraries (they contain device-specific policies) PRODUCT_SYSTEM_SERVER_JARS += \ my-device-services PRODUCT_PACKAGES += \ my-device-servicesCập nhật
config_deviceSpecificDeviceStatePolicyProviderthành tên lớp của nhà cung cấp trong tệpconfig.xml, ví dụ:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>