На складных устройствах книжной формы можно включить поддержку режимов «палатка» и «клин».
Режимы «палатка» и «клин» позволяют использовать внешний экран, когда устройство слегка приоткрыто, как показано на следующем рисунке:

Рисунок 1. Варианты складывания палатки и клина.
В режиме «палатка» устройство частично открыто, опираясь на обе половины для устойчивости, как палатка. В режиме «клин» устройство опирается на свою правую половину, которая лежит ровно на поверхности.
В Android 16 и более поздних версиях это поведение поддерживается с помощью политики состояния устройства BookStyleDeviceStatePolicy . Эта политика работает на складных устройствах с двумя экранами, расположенных в виде книги, при этом шарнир находится с левой стороны устройства в сложенном состоянии.
Эта политика позволяет дольше сохранять внешний экран в развернутом состоянии при определенных условиях, например:
- Правая половина устройства в основном плоская, что указывает на то, что устройство, вероятно, находится в режиме клиновидной формы.
- Ориентация устройства — перевернутая альбомная, что указывает на вероятный режим "палатки".
- Ориентация экрана — альбомная или перевернутая альбомная.
- Присутствует приложение, удерживающее блокировку экрана (предотвращающее тайм-аут экрана).
Данная политика не вводит отдельное состояние устройства для положения палатки или клина; она сохраняет закрытое состояние для более широкого диапазона углов шарниров в этих конкретных условиях.
Для полноценной поддержки этих эвристических методов устройству необходимо:
- Датчик угла шарнира, отображающий угол между двумя половинами устройства.
- Акселерометр расположен на каждой из (левой и правой) половин устройства.
Настройте режим палатки или клина.
Выполните следующие шаги, чтобы включить поддержку режимов «палатка» и «клин» на вашем устройстве:
Создайте реализацию
DeviceStatePolicy.Provider, которая возвращает экземплярBookStyleDeviceStatePolicy. Этот экземпляр должен предоставлять все необходимые зависимости, такие как объекты датчиков, конструкторуBookStyleDeviceStatePolicy.Следующий пример демонстрирует реализацию:
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); } }Добавьте поставщика политик в classpath системного сервера. Для начала создайте библиотеку с классом поставщика политик состояния устройства, который вы создали на предыдущем шаге.
В следующем примере показана конфигурация шаблона
Android.bpот Soong:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }Затем, чтобы добавить эту библиотеку на системный сервер, измените файл makefile устройства, добавив следующие строки:
# Add system service libraries (they contain device-specific policies) PRODUCT_SYSTEM_SERVER_JARS += \ my-device-services PRODUCT_PACKAGES += \ my-device-servicesВ файле
config.xmlизмените значениеconfig_deviceSpecificDeviceStatePolicyProviderна имя класса вашего поставщика, например:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>