На устройствах, складывающихся в форме книги, можно включить поддержку режимов палатки и клина.
Режимы «палатка» и «клин» позволяют использовать внешний экран, когда устройство слегка приоткрыто, как показано на следующем рисунке:
Рисунок 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 системного сервера. Начните с создания библиотеки с классом поставщика политики состояния устройства, созданным на предыдущем шаге.
В следующем примере показана конфигурация чертежа Soong
Android.bp
:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }
Затем, чтобы добавить эту библиотеку на системный сервер, измените make-файл устройства, добавив следующие строки:
# 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>