На складных устройствах в виде книги можно включить поддержку режимов палатки и клина.
В режимах "Палатка" и "Клин" можно использовать внешний экран, когда устройство немного раскрыто, как показано на рисунке ниже.

Рисунок 1. Режимы "Палатка" и "Клин".
В режиме домика устройство частично открыто и опирается на обе половины. В режиме клина устройство опирается на правую половину, которая лежит на поверхности.
В Android 16 и более поздних версиях это поведение поддерживается с помощью правила состояния устройства BookStyleDeviceStatePolicy. Это правило работает на складном устройстве с двумя экранами, расположенными как страницы книги, и шарниром, который находится слева, когда устройство сложено.
Это правило позволяет дольше держать внешний экран включенным при раскладывании устройства в определенных условиях, например:
- Правая половина устройства в основном плоская, что указывает на то, что устройство, вероятно, находится в режиме клина.
- Устройство находится в горизонтальной ориентации, перевернутой на 180 градусов, что указывает на то, что оно, вероятно, используется в режиме палатки.
- Экран находится в горизонтальной или перевернутой горизонтальной ориентации.
- Приложение удерживает блокировку экрана (предотвращая отключение экрана).
Правило не вводит отдельное состояние устройства для режима "палатка" или "треугольник". Оно сохраняет состояние "Закрыто" для более широкого диапазона углов наклона шарнира при определенных условиях.
Чтобы полностью поддерживать эти эвристические методы, устройству необходимо:
- Датчик угла шарнира, сообщающий угол между двумя половинами устройства.
- Датчик акселерометра на каждой половине устройства (левой и правой)
Как настроить режим палатки или подставки
Чтобы включить поддержку режима палатки и подставки на устройстве, выполните следующие действия:
Создайте реализацию
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); } }Добавьте поставщика правил в путь к классам системного сервера. Начните с создания библиотеки с классом поставщика правил состояния устройства, который вы создали на предыдущем шаге.
Ниже приведен пример конфигурации схемы Soong
Android.bp.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_deviceSpecificDeviceStatePolicyProviderна название класса вашего поставщика в файлеconfig.xml, например:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>