Режим совместимости с устройствами

Android активирует режим совместимости для приложений, в которых заявлены ограничения на ориентацию или изменение размера. Режим совместимости обеспечивает приемлемое поведение приложения на устройствах с большим экраном, складных телефонах-раскладушках и в настольных средах, но с неоптимальным удобством использования.

Переопределения для отдельных приложений позволяют производителям устройств, владельцам виртуальных устройств1 и пользователям менять поведение приложений, чтобы улучшать их макет или предотвращать сбои на определенных устройствах.

Android 16

Android 16 (уровень API 36) игнорирует ограничения на ориентацию экрана, соотношение сторон и изменение размера приложения, чтобы улучшить макет приложений на устройствах с наименьшей шириной >= 600 dp.

Для приложений с целевым уровнем API 36 не работают следующие переопределения:

Отключить

Приложение может быть предназначено для целевого уровня API 36, но не использовать поведение Android 16. В этом случае OVERRIDE_ANY_ORIENTATION_TO_USER неприменимо.

Объявление свойства манифеста

Чтобы отказаться от поведения, заданного в уровне API 36, объявите свойство манифеста PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY.

Чтобы отключить сбор данных для определенного действия, задайте свойство в элементе <activity>:

<activity ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</activity>

Чтобы отключить эту функцию для всего приложения, задайте свойство в элементе <application>:

<application ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</application>

Если приложение поддерживает Android 16 (уровень API 36) или более поздние версии, это свойство не блокирует ориентацию экрана и не предотвращает его поворот на больших дисплеях.

Эталонные устройства

Для следующих устройств может потребоваться переопределение настроек отдельных приложений из-за необычных конфигураций или конфигураций, которые плохо поддерживаются приложениями:

  • Планшеты. Для некоторых планшетов, например Pixel Tablet, естественной является горизонтальная ориентация. Устройство находится в естественной ориентации, когда Display#getRotation() возвращает Surface.ROTATION_0. Если приложения считают, что ROTATION_0 – это портретная ориентация, макеты приложений и предпросмотр камеры могут не соответствовать экрану устройства.
  • Складные устройства с горизонтальной ориентацией. Некоторые складные устройства, например Pixel Fold, в сложенном виде имеют вертикальную ориентацию, а в разложенном – горизонтальную. Если приложение предполагает, что в развернутом виде ориентация экрана книжная, могут возникнуть циклы мерцания или проблемы с макетом.
  • Раскладные телефоны. В разложенном виде они обычно имеют книжную ориентацию. Однако в сложенном виде у них обычно небольшой экран в горизонтальной ориентации. Приложения должны определять и поддерживать разные ориентации экранов.
  • Внешние дисплеи. На некоторых устройствах можно запустить сеанс многооконного режима на внешних подключенных дисплеях. Приложения должны запрашивать у внешних дисплеев информацию, например размер экрана и разрешение. В противном случае приложения могут делать неверные предположения о дисплеях, что может привести к некорректному поведению приложения.
  • Дисплеи автомобилей. Многие, но не все дисплеи автомобилей имеют горизонтальную ориентацию. Разработка приложений для припаркованных автомобилей похожа на разработку приложений для планшетов.

Распространенные проблемы с совместимостью

Чаще всего проблемы с совместимостью возникают из-за ограничений ориентации, изменения размера и соотношения сторон, неправильной обработки ориентации предварительного просмотра камеры и неправильного использования API.

Леттербоксинг (игра)

Приложение размещается в центре экрана или, если экран большой, с одной из сторон для удобства. Неиспользуемая область экрана по бокам или сверху и снизу заполняется однотонными полосами или размытыми обоями.

Это часто происходит на устройствах с большим экраном, потому что их размеры и соотношение сторон обычно отличаются от стандартных телефонов, для которых разработано большинство приложений.

Рисунок 1. Приложение, поддерживающее только вертикальную ориентацию, показывается в режиме Letterbox на планшете и складном устройстве в горизонтальной ориентации.

Проблема

Приложение не поддерживает все конфигурации экрана, потому что у него фиксированная ориентация, фиксированное соотношение сторон или неизменяемый размер.

К настройкам конфигурации, которые управляют ориентацией и возможностью изменения размера приложения, относятся:

  • screenOrientation – задает фиксированную ориентацию для приложения. Приложения также могут задавать ориентацию во время выполнения с помощью Activity#setRequestedOrientation().

  • resizeableActivity – указывает, может ли система изменять размер приложений, чтобы они помещались в окна разных размеров. В Android 11 (уровень API 30) и более ранних версиях указывает, поддерживают ли приложения многооконный режим. В Android 12 (уровень API 31) и более поздних версиях указывает, поддерживают ли приложения многооконный режим на небольших экранах (компактный класс размера окна). На устройствах с Android 12 и более поздними версиями ОС приложения поддерживают многооконный режим на больших экранах (среднего или расширенного класса размера окна) независимо от этой настройки.

  • maxAspectRatio – максимальное соотношение сторон , поддерживаемое приложением. Этот атрибут можно задатьmaxAspectRatio, только если для атрибута resizeableActivity установлено значение false.

  • minAspectRatio – минимальное соотношение сторон, поддерживаемое приложением. Этот атрибут minAspectRatio можно задать только для приложений, у которых атрибут resizeableActivity имеет значение false.

Оптимизация

Приложение должно поддерживать все ориентации и размеры экрана, а также многооконный режим. Удалите все ограничения на ориентацию и фиксированное соотношение сторон из макетов приложения и файла манифеста приложения.

Обходной путь для обеспечения совместимости

Если приложение с фиксированной ориентацией или соотношением сторон запускается в окне, размер или ориентация которого не поддерживаются, Android добавляет черные полосы по краям, чтобы сохранить непрерывность.

Начиная с Android 12 (уровень API 31) и 12L (уровень API 32), платформа применяет ряд улучшений к приложениям с кашетированием. Производители устройств реализуют улучшения пользовательского интерфейса. Чтобы воспользоваться преимуществами улучшений, вам не нужно выполнять никаких дополнительных действий.

В Android 12 (уровень API 31) появились следующие улучшения внешнего вида, которые могут настраивать производители устройств:

  • Закругленные углы. Углы окна приложения выглядят более изящно.
  • Прозрачность системной строки. Строка состояния и панель навигации, которые накладываются на приложение, полупрозрачны, поэтому значки на них всегда видны на фоне каше.
  • Настраиваемое соотношение сторон. Соотношение сторон приложения можно изменить, чтобы улучшить его внешний вид.

Рисунок 2. Приложение в режиме Letterbox с улучшенным интерфейсом.

В 12L (уровень API 32) добавлены следующие функциональные улучшения:

  • Настраиваемое расположение. На больших экранах производители устройств могут размещать приложение в левой или правой части дисплея, чтобы упростить взаимодействие.

  • Обновленная кнопка перезапуска. Производители устройств могут изменить внешний вид кнопки перезапуска для режима совместимости размеров, чтобы пользователям было проще ее найти.

В Android 13 (уровень API 33) добавлено диалоговое окно с информацией о том, как разместить приложение в режиме леттербокса на экране или включить его в режим разделения экрана.

Рисунок 3. Приложение в режиме Letterbox с диалоговым окном для обучения пользователей.

Режим совместимости размеров

Режим совместимости размеров – это кашетирование, которое сохраняет соотношение сторон приложения и включает элемент управления перезапуском. Этот элемент управления позволяет пользователям перезапустить приложение и перерисовать экран. Android вызывает режим совместимости размеров для приложений, размер которых нельзя изменить. Когда действие перемещается в контейнер, несовместимый с его размерами, система может масштабировать приложение, чтобы заполнить экран устройства хотя бы по одному измерению.

Изменения конфигурации устройства, которые могут активировать режим совместимости размеров, включают:

  • Поворот устройства
  • Складное устройство в сложенном и разложенном виде
  • Как переключаться между полноэкранным режимом и режимом разделения экрана

Проблема

Режим совместимости размеров обычно применяется к действиям, которые ограничены в ориентации или соотношении сторон и настроены (или определены системой) как неизменяемые.

Приложение считается поддерживающим изменение размера и не будет запускаться в режиме совместимости, если оно соответствует любому из следующих критериев:

Если приложение не соответствует ни одному из условий, оно считается не поддерживающим изменение размера и может быть запущено в режиме совместимости размеров.

Оптимизация

Приложение должно поддерживать все размеры экрана. Чтобы размер окна приложения можно было менять, в манифесте приложения задайте для атрибута android:resizeableActivity элемента <activity> или <application> значение true. Создайте адаптивные макеты для приложения. Подробнее о том, как обеспечить поддержку экранов разных размеров и многооконного режима…

Обходной путь для обеспечения совместимости

Android переводит приложение в режим совместимости размеров, когда система определяет, что отображение приложения в режиме леттербокс можно улучшить, изменив масштаб приложения, чтобы оно заполнило окно дисплея хотя бы в одном измерении. Система показывает элемент управления перезапуском, который воссоздает процесс приложения, воссоздавая действие и перерисовывая дисплей. Также ознакомьтесь с обзором процессов и потоков.

Режим совместимости дисплея

Режим совместимости с экраном предотвращает перезапуск приложения при его перемещении между разными экранами, что может привести к изменению конфигурации, например цветового режима, доступности сенсорного экрана или плотности экрана.

Режим совместимости экрана по умолчанию включен для игр (на основе флага android:appCategory), чтобы повысить стабильность и непрерывность. В отличие от режима совместимости размеров, режим совместимости дисплея не замораживает конфигурацию приложения. Приложение по-прежнему может получать все обновления конфигурации через API, например обратный вызов onConfigurationChanged(), но без перезапуска. Это означает, что игры, которые поддерживают API, такие как onConfigurationChanged(), могут обновлять интерфейс, даже если они находятся в режиме совместимости.

Чтобы отключить режим совместимости и обрабатывать изменения конфигурации в приложении, объявите поддержку изменений конфигурации в файле AndroidManifest.xml приложения и обрабатывайте изменения конфигурации в обратном вызове onConfigurationChanged().

<activity
    android:name=".MyGameActivity"
    android:configChanges="colorMode|touchscreen|density|...">
    ...
</activity>

Мерцающие петли

Если приложение поддерживает не все ориентации экрана, оно может постоянно запрашивать новые ориентации при изменении конфигурации. Это приводит к бесконечному циклу, из-за которого экран мерцает или приложение постоянно поворачивается.

Проблема

На устройствах с Android 12 (уровень API 31) и более поздними версиями ОС производители могут игнорировать ограничения ориентации, заданные приложениями, и вместо этого принудительно использовать режимы совместимости. Например, складное устройство может игнорировать настройку android:screenOrientation="portrait", когда действие отображается на внутреннем экране размером с планшет в альбомной ориентации.

Если ограничения ориентации приложения игнорируются, приложение может программно задать ориентацию, вызвав Activity#setRequestedOrientation(). Если приложение не обрабатывает изменения конфигурации, вызов перезапускает его (см. раздел Обработка изменений конфигурации). После перезапуска ограничения ориентации снова игнорируются, приложение повторно вызывает setRequestedOrientation(), что приводит к перезапуску, и так далее.

Другой пример – когда естественная ориентация (обычная ориентация, определяемая Android) экрана устройства является горизонтальной (то есть вызов Display#getRotation() возвращает Surface.ROTATION_0, а соотношение сторон экрана устройства является горизонтальным). Раньше приложения предполагали, что Display.getRotation() = Surface.ROTATION_0 означает книжную ориентацию устройства, но это не всегда так, например на внутреннем экране некоторых складных устройств и на некоторых планшетах.

Приложение в горизонтальной ориентации на внутреннем складном дисплее может проверить поворот экрана, получить значение ROTATION_0, предположить, что естественная ориентация устройства – вертикальная, и вызвать setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ), чтобы изменить макет приложения. После перезапуска в горизонтальной ориентации приложение может снова проверить ориентацию экрана, получить значение ROTATION_0, вызвать setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) и продолжить бесконечный цикл.

Оптимизация

Приложения не должны:

  • Задайте ориентацию по умолчанию с помощью Activity#setRequestedOrientation() в методе onCreate(), поскольку запрос ориентации может быть вызван необработанными изменениями конфигурации.
  • Предположим, что естественная ориентация устройства (ROTATION_0) – вертикальная.
  • Задайте ориентацию на основе сигналов, не связанных с текущим размером окна, например Display#getRotation(), наличия FoldingFeature или устаревших API.

Обходной путь для обеспечения совместимости

Android игнорирует вызовы Activity#setRequestedOrientation() в следующих ситуациях:

  • Действие уже перезапущено из предыдущего вызова метода или включена принудительная обработка поворота для совместимости с камерой (см. раздел Предварительный просмотр с камеры ниже).

    Производители устройств могут применить такое поведение к приложению с помощью OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • Действие отправило более двух запросов на изменение ориентации за одну секунду, что указывает на возникновение цикла. Из двух запросов в цикле Android использует тот, который максимизирует область отображения приложения.

    Производители устройств могут применить это поведение к приложению с помощью OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

  • Владельцы виртуальных устройств переопределили вызов метода на некоторых устройствах.

Предпросмотр камеры

На планшетах, ноутбуках и складных устройствах предпросмотр камеры (или видоискатель) в приложениях для съемки может быть смещен или искажен.

См. также раздел Предварительный просмотр камеры в многооконном режиме.

Проблема

В документе с определением совместимости Android указано, что матрица камеры должна быть ориентирована так, чтобы длинная сторона камеры совпадала с длинной стороной экрана.

Приложения часто предполагают, что ориентация устройства и датчика камеры является портретной – разумное предположение для стандартных мобильных телефонов. Однако для планшетов и ноутбуков, а также их датчиков визуального распознавания естественной является горизонтальная ориентация. Кроме того, у новых типов устройств, например складных, может быть несколько естественных ориентаций и несколько датчиков камеры в разных ориентациях.

Если запустить действие с ориентацией камеры, которую приложение не ожидает, или переключиться между разными камерами или экранами устройства (для складных устройств), предпросмотр камеры может быть смещен или искажен.

Оптимизация

Приложения камеры должны правильно определять и обрабатывать ориентацию устройства и датчика камеры, чтобы показывать изображение с камеры в правильном положении и масштабе. Приложения должны рассчитывать поворот устройства, поворот датчика и соотношение сторон экрана или окна, а затем применять результаты к предварительному просмотру камеры. Подробные инструкции вы найдете в статьях Предпросмотр камеры и Представляем видоискатель камеры.

Обходной путь для обеспечения совместимости

Устройство находится в естественной ориентации, когда Display#getRotation() возвращает Surface.ROTATION_0. Система рассчитывает CameraCharacteristics.SENSOR_ORIENTATION на основе естественной ориентации устройства. Android выравнивает вертикальное окно приложений с ограниченной ориентацией по естественной ориентации устройства, как и ожидается в большинстве приложений. Android также обрезает изображение с датчика камеры, если датчик ориентирован горизонтально, а предварительный просмотр камеры – вертикально. The specific workarounds include the following:

  • Принудительно поворачивать изображение с камеры в приложениях, поддерживающих только вертикальную ориентацию. В приложениях, поддерживающих только вертикальную ориентацию, предполагается, что устройство и датчик камеры находятся в вертикальном положении. Однако в Android 12 (уровень API 31) и более поздних версиях приложения могут работать в нескольких ориентациях, если производители устройств игнорируют спецификацию ориентации.

    Когда приложение с ограничением на портретную ориентацию подключается к камере, Android принудительно поворачивает приложение, чтобы выровнять его портретное окно с естественной ориентацией устройства.

    На некоторых планшетах (см. эталонные устройства) окно приложения в вертикальной ориентации поворачивается в полноэкранный режим, чтобы соответствовать естественной ориентации устройства. После принудительного поворота приложение занимает весь экран.

    На внутреннем экране складных устройств в горизонтальной ориентации (см. эталонные устройства) действия, которые поддерживают только вертикальную ориентацию, поворачиваются горизонтально, чтобы соответствовать естественной ориентации разложенного устройства. После принудительного поворота приложение показывается в режиме Letterbox.

  • Кадрирование внутренней фронтальной камеры. На некоторых складных устройствах датчик внутренней фронтальной камеры расположен горизонтально. Помимо принудительного поворота изображения с камеры на внутреннем экране, Android обрезает зону обзора внутренней фронтальной камеры (в горизонтальной ориентации), чтобы датчик захватывал изображение, противоположное ориентации устройства.

  • Принудительное обновление предпросмотра с камеры. После принудительного поворота система поочередно вызывает методы onStop() и onStart() (по умолчанию) или onPause() и onResume() (применяется при переопределении OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE для приложения), чтобы обеспечить правильное отображение предпросмотра с камеры.

  • Масштабирование соотношения сторон. Система динамически меняет соотношение сторон принудительно повернутого изображения с камеры на более высокое минимальное соотношение сторон, что обеспечивает правильное масштабирование изображения.

Разработчики приложений могут переопределить эти обходные решения, если приложения правильно обрабатывают предварительный просмотр камеры. Подробнее о переопределении настроек для отдельных приложений…

API, которые часто используются не по назначению

По мере того как в Android добавлялась поддержка таких функций, как многооконный режим, и таких устройств, как складные телефоны, устаревшие API заменялись современными, которые работают на экранах всех размеров и на устройствах всех форм-факторов. Однако устаревшие API по-прежнему доступны для обратной совместимости.

Некоторые API View предназначены для специальных целей, которые не всегда понятны разработчикам.

Проблема

Разработчики продолжают использовать устаревшие API Display и ошибочно полагают, что эти API возвращают границы приложения, а не границы области экрана устройства. или по ошибке используют API для специальных целей, чтобы получить общие показатели. В результате при изменении размера окна приложения элементы интерфейса перемещаются неправильно, что приводит к проблемам с макетом.

Устаревшие и часто неправильно используемые API для медийной рекламы:

Подробнее о поддержке многооконного режима…

Неправильное использование API для просмотра:

Оптимизация

Никогда не полагайтесь на физический размер экрана при размещении элементов интерфейса. Перенесите свое приложение на API, основанные на WindowMetrics, включая следующие API WindowManager:

Обходной путь для обеспечения совместимости

Два переопределения корректируют устаревшие API Display и неправильно используемые API View, чтобы возвращать границы приложения: ALWAYS_SANDBOX_DISPLAY_APIS для API Display и OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS для API View. ALWAYS_SANDBOX_DISPLAY_APIS также по умолчанию применяется к приложениям, которые соответствуют требованиям для режима совместимости размеров.

Прозрачные действия

Прозрачные действия являются результатом использования стилей прозрачного фона, например:

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Темы, связанные с диалоговыми окнами, например Theme.MaterialComponents.Dialog, могут включать стили, которые делают действия прозрачными.

Прозрачные действия не занимают всю доступную область экрана, поэтому ими сложно управлять. Доступная область экрана может меняться в зависимости от конфигурации, например при повороте устройства, его складывании и раскладывании, а также в многооконном режиме.

Проблема

Прозрачный объект activity должен соответствовать границам первого непрозрачного объекта activity, расположенного ниже в стеке объектов activity задачи. Однако непрозрачное действие, которое запускает диалоговое окно разрешения, может быть трамплином (действием, которое запускает другое действие, а затем исчезает). В этом случае система не может определить границы действия-трамплина, запустившего прозрачное действие диалогового окна разрешения.

Оптимизация

Прозрачные действия наследуют ограничения от самого верхнего непрозрачного действия под ними в стеке действий задачи. Непрозрачное действие должно быть доступно на протяжении всего жизненного цикла прозрачного действия – от создания до удаления. Поэтому не запускайте запросы разрешений из действий-трамплинов.

Если трамплин-активность запускает запрос разрешений, пользователь может не увидеть диалоговое окно, потому что трамплин-активность будет уничтожена до того, как пользователь успеет ответить на запрос. Кроме того, размеры и положение диалогового окна могут быть рассчитаны неправильно.

Запросы разрешений должны всегда запускаться из действий, которые остаются видимыми, пока пользователь не примет решение.

Закругленные углы

Это может быть связано с тем, что в стиле указана прозрачность фона или контент не заполняет доступное пространство экрана. Если прозрачное действие заполняет доступное пространство экрана, система автоматически применяет к нему закругленные углы, если это настроено производителем устройства. Однако если прозрачное действие (например, диалоговое окно разрешения) не заполняет доступное пространство, вы сами решаете, применять ли закругленные углы.

Диалоговые окна разрешений не заполняют доступное пространство экрана, поскольку в их макете обычно используется LayoutParams.WRAP_CONTENT, а не LayoutParams.MATCH_PARENT.

Обходной путь для обеспечения совместимости

Не скрывайте действия, которые запускают диалоговые окна, пока пользователь не ответит на диалог.

Система гарантирует, что прозрачное действие наследует все ограничения от первого непрозрачного действия, расположенного под ним в стеке действий, включая ограничения, связанные со следующими аспектами:

  • Режим совместимости размеров
  • Ориентация
  • Соотношение сторон

Игры Unity

Игры Unity работают на Android в полноэкранном или многооконном режиме. Однако многие игры Unity теряют фокус и перестают отрисовывать контент, когда приложение переходит в многооконный режим.

Проблема

В Unity 2019.4 добавлена настройка Resizable Window для поддержки многооконного режима на Android. Однако первоначальная реализация не реагировала должным образом на жизненный цикл объекта activity в многооконном режиме, из-за чего UnityPlayer приостанавливал воспроизведение, когда приложение теряло фокус. В проигрывателе отображается черный экран или последний кадр игры. Игра возобновлялась, только когда пользователь нажимал на экран. Многие приложения на движке Unity сталкиваются с этой проблемой и отображаются как черное окно в многооконном режиме.

Оптимизация

Обновите Unity до версии 2019.4.40 или более поздней и экспортируйте игру заново. Не снимайте флажок Resizable Window в настройках проигрывателя Android, иначе игра будет приостанавливаться, когда она не в фокусе, даже если она полностью видна в многооконном режиме.

Обходной путь для обеспечения совместимости

Производители устройств могут применить переопределение OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS для отдельных приложений, чтобы передавать им ложное событие фокуса в многооконном режиме. Это позволяет перерисовывать контент и избегать черного экрана.

Многооконный режим

При запуске приложений в многооконном режиме могут возникать дополнительные проблемы с совместимостью.

Размер приложений с заблокированной ориентацией можно изменять без ограничений. Даже если для действия задана книжная ориентация, пользователи могут изменить размер приложения на альбомную ориентацию.

Анимация: размер окна приложения меняется с вертикального на горизонтальный.

Однако если действие объявлено как неизменяемое (resizeableActivity = false), интерфейс действия масштабируется с сохранением того же соотношения сторон.

Анимация изменения размера приложения. Интерфейс масштабируется по размеру окна.

Предпросмотр камеры в многооконном режиме

Когда приложение работает в многооконном режиме, поворот экрана и ориентация окна могут отличаться от того, что пользователи видят в полноэкранном режиме на стандартных телефонах.

Проблема

Приложения часто предполагают, что ориентация устройства и датчика камеры является портретной, что может привести к неправильному выравниванию или искажению предварительного просмотра камеры.

Оптимизация

Приложения камеры должны правильно определять и обрабатывать ориентацию устройства и датчика камеры, чтобы показывать изображение с камеры в правильном положении и масштабе. Приложения должны рассчитывать поворот устройства, поворот датчика и соотношение сторон окна, а затем применять результаты к предварительному просмотру камеры, который также должен реагировать на изменения конфигурации окна. Подробные инструкции приведены в разделе Предварительный просмотр с камеры.

Обходной путь для обеспечения совместимости

Когда приложения с фиксированной ориентацией в многооконном режиме запускают предпросмотр камеры, система может задействовать режим совместимости камеры, чтобы избежать растянутых и боковых предпросмотров.

В этом случае среда изолируется в соответствии с запрошенной ориентацией следующими способами:

  • Добавьте черные полосы по краям окна приложения, чтобы оно соответствовало запрошенной ориентации. Это позволит избежать растягивания из-за неправильного масштабирования.

  • Изоляция поворота экрана. Имитируется поворот устройства в запрошенную ориентацию. Поскольку наиболее распространенное неверное предположение для предварительного просмотра камеры заключается в том, что приложение работает на устройстве в портретном режиме, поворот дисплея изолирован до 0 градусов для приложений, запрашивающих портретную ориентацию, и до 90 градусов для устройств, запрашивающих альбомную ориентацию.

  • Кадрирование изображения с камеры. Если ориентация экрана изменилась, это отражается на видеопотоке с камеры. Например, если устройство находится в альбомной ориентации, а приложение запрашивает портретную, то зона обзора камеры кадрируется так, чтобы соответствовать портретной ориентации.

  • Поворот и кадрирование видеопотока с камеры. После применения обработки система поочередно вызывает методы onStop() и onStart() (по умолчанию) или onPause() и onResume() (применяются при переопределении OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE для каждого приложения), чтобы обеспечить правильное отображение предварительного просмотра камеры.

Разработчики приложений могут переопределить эти обходные решения, если приложения правильно обрабатывают предварительный просмотр камеры. Подробнее о переопределении настроек для отдельных приложений…

Изменение размера

Когда включена симуляция запрошенной ориентации, при изменении размера окна интерфейс видоискателя масштабируется с сохранением соотношения сторон. Остальную часть окна приложения можно свободно изменять.

Как проверить приложение на проблемы с совместимостью

Чтобы протестировать приложение и понять, как оно работает на разных типах устройств, воспользуйтесь следующими ресурсами:

С леттербоксом

Убедитесь, что каждое действие может использовать все доступное приложению пространство экрана. Сначала объявите следующий код в тестовой папке:

Kotlin

fun isLetterboxed(activity: AppCompatActivity): Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

Java

public boolean isLetterboxed(AppCompatActivity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds();
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

Затем запустите тест, чтобы проверить поведение и убедиться, что целевое действие не показывается в режиме почтового ящика:

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertFalse(it.isLetterboxed())
    }
}

Java

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

@Test
public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario =
        ActivityScenario.launch(MainActivity.class)) {
            scenario.onActivity( activity -> {
                assertFalse(activity.isLetterboxed());
            });
        }
}

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

Переопределения для отдельных приложений

В Android есть переопределения, которые меняют заданное поведение приложений. Например, переопределение FORCE_RESIZE_APP указывает системе, что нужно обойти режим совместимости размеров и изменить размер приложения в соответствии с размерами экрана, даже если в манифесте приложения указано resizeableActivity="false".

Производители устройств применяют переопределения к определенным или всем приложениям на некоторых устройствах. В Android 14 (уровень API 34) и более поздних версиях пользователи могут переопределять настройки приложений в настройках устройства. В Android 16 (уровень API 36) и более поздних версиях владельцы виртуальных устройств могут применять переопределения на выбранных устройствах, которыми они управляют.

Переопределения для отдельных приложений

В Android 14 и более поздних версиях пользователи могут менять соотношение сторон приложений в меню настроек. Устройства с большим экраном, например эталонные устройства, поддерживают меню.

В меню содержится список всех приложений, установленных на устройстве. Пользователи выбирают приложение, а затем устанавливают для него соотношение сторон 3:4, 1:1, полноэкранный режим или другое значение, настроенное производителем устройства. Пользователи также могут сбросить соотношение сторон до значения по умолчанию, указанного в манифесте приложения.

Приложения могут отказаться от переопределения совместимости, установив следующие теги PackageManager.Property:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Чтобы отказаться от переопределения совместимости соотношения сторон пользователя, добавьте свойство в манифест приложения и задайте для него значение false:

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    Ваше приложение будет исключено из списка приложений в настройках устройства. Пользователи не смогут переопределить соотношение сторон приложения.

    Установка для свойства значения true ни на что не влияет.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Чтобы отказаться от полноэкранного режима переопределения совместимости пользовательского соотношения сторон, добавьте свойство в манифест приложения и задайте для него значение false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

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

    Установка для этого свойства значения true ни на что не влияет.

Оптимизируйте приложение для всех экранов. Не устанавливайте ограничения на соотношение сторон. Используйте классы размеров окон, чтобы поддерживать разные макеты в зависимости от доступного пространства на экране.

Переопределения для отдельных приложений на устройстве

Производители устройств и владельцы виртуальных устройств (некоторые доверенные и привилегированные приложения) применяют переопределения для отдельных приложений на определенных устройствах, включая планшеты, складные устройства, устройства с ChromeOS и автомобильные дисплеи. На эталонных устройствах некоторые переопределения могут применяться к разным приложениям по умолчанию.

Приложения могут отказаться от большинства переопределений (см. таблицу Переопределения для отдельных приложений ниже).

Вы можете протестировать приложение с включенными или отключенными переопределениями, используя инструменты тестирования на совместимость. Если переопределения включены, они применяются ко всему приложению.

Вы также можете использовать Android Debug Bridge (adb), чтобы включать или отключать переопределения и определять, какие из них применяются к вашему приложению.

Чтобы включить или отключить переопределения, выполните следующие действия:

adb shell am compat enable/disable <override name/id> <package>

Проверьте, какие переопределения применяются к вашему приложению на эталонных устройствах:

adb shell dumpsys platform_compat | grep <package name>

В таблице ниже перечислены доступные переопределения и рекомендации по оптимизации приложения, чтобы оно не зависело от переопределений. Чтобы отказаться от некоторых переопределений, добавьте в манифест приложения флаги свойств.

Переопределения для отдельных приложений
Тип Название ID Описание
Совместимость ввода OVERRIDE_MOUSE_TO_TOUCH 413207127 Преобразует экземпляры MotionEvent, полученные от мыши, в события касания, перезаписывая источник и тип инструмента MotionEvent при их передаче в приложение.
Изменение размера FORCE_RESIZE_APP 174042936 Обходит режим совместимости размеров для приложения при изменении конфигурации.
FORCE_NON_RESIZE_APP 181136395 Принудительно переводит приложение в режим совместимости размеров при изменении конфигурации.
Соотношение сторон OVERRIDE_MIN_ASPECT_RATIO 174042980 Переопределение, которое необходимо включить, чтобы применить другие переопределения соотношения сторон.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Если включено (по умолчанию), ограничения переопределяют область действия только для действий в портретном режиме.
OVERRIDE_MIN_ASPECT_RATIO_SMALL 349045028 Минимальное соотношение сторон изменено на 4:3.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Изменяет минимальное соотношение сторон на 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Минимальное соотношение сторон изменено на 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Минимальное соотношение сторон изменено, чтобы соответствовать 50% размера экрана (или соотношению сторон в режиме разделения экрана).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Отключает переопределение минимального соотношения сторон, чтобы приложения открывались в полноэкранном режиме, когда устройство находится в портретной ориентации.
Ориентация OVERRIDE_ANY_ORIENTATION 265464455 Позволяет переопределить любую ориентацию.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 Переопределяет ограничения на ориентацию, изменение размера и соотношение сторон.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Принудительно устанавливает книжную ориентацию, если она не задана.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Переопределяет ориентацию на nosensor (использовать естественную ориентацию устройства), если ориентация действия не определена.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Поворачивает приложения, поддерживающие только альбомную ориентацию, на 180 градусов.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Ограничивает область переопределения ориентации, когда приложение подключено к камере.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Устанавливает фиксированную горизонтальную ориентацию экрана, когда задача выполняется в полноэкранном режиме (в том числе с черными полосами по краям).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Игнорирует запросы приложения на изменение ориентации, чтобы избежать бесконечных циклов поворота.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Игнорирует повторные запросы ориентации во время перезапуска действия. Если Android обнаруживает, что приложение запрашивает как минимум две новые ориентации в течение одной секунды, система считает это бесконечным циклом поворота и применяет переопределение.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Отключает параметр игнорирования запроса ориентации, заданный производителем устройства, чтобы предотвратить появление черных полос по краям экрана.
API тестовой среды NEVER_SANDBOX_DISPLAY_APIS 184838306 Запрещает изменять поведение любых API экрана.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Принудительно заставляет API Display в приложении возвращать границы приложения. API Display возвращают границы логической области отображения, но иногда приложение предполагает, что API Display возвращают границы приложения, что приводит к проблемам с интерфейсом.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Принудительно заставляет API View, используемые в приложении, возвращать границы приложения. API View возвращают границы логической области отображения, но иногда приложение предполагает, что API View возвращают границы приложения, что приводит к проблемам с интерфейсом.
Совместимость камеры OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Отключает принудительную ротацию. По умолчанию все приложения камеры с фиксированной ориентацией принудительно поворачиваются, когда открыт предварительный просмотр камеры.
OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION 398195815 Отключает симуляцию запрошенной ориентации для совместимости с камерой. По умолчанию приложения камеры с фиксированной ориентацией настраиваются в соответствии с запрошенной ориентацией, когда открыт предварительный просмотр камеры.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Удаляет принудительное обновление по умолчанию, которое применяется при принудительном повороте изображения с камеры.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Переключает жесткое обновление на мягкое, когда принудительно поворачивается предварительный просмотр камеры. Это помогает сохранить состояние во время принудительного поворота. По умолчанию Android применяет жесткое обновление, когда предварительный просмотр камеры принудительно поворачивается. Принудительное обновление может привести к потере состояния или отключению приложений в зависимости от того, как они кешировали свое предыдущее состояние.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Обрезает буфер изображения внутренней фронтальной камеры. Если переопределение отключено, кадрирование внутренней фронтальной камеры отменяется, а зона обзора в режиме предварительного просмотра увеличивается. По умолчанию на некоторых складных устройствах (см. эталонные устройства) система обрезает изображение с внутренней фронтальной камеры во всех приложениях камеры.
Другое OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Предотвращает затемнение приложения, когда оно теряет фокус в режиме разделения экрана. Приложение ожидает фокуса, прежде чем отрисовать контент, что может привести к зависанию или черному экрану. Переопределение позволяет Android отправлять приложению ложное событие фокуса, которое сигнализирует приложению о необходимости снова начать отрисовку контента.
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS 388014743 Исключает вставки строки заголовка из границ приложения в конфигурации действия в многооконном режиме. Это предотвращает перекрытие элементов интерфейса приложения строкой заголовка или их обрезку, если приложение не обрабатывает вставки строки заголовка.

OVERRIDE_MOUSE_TO_TOUCH

Включает режим совместимости, который преобразует экземпляры MotionEvent от мыши или сенсорной панели в события касания, заменяя источник MotionEvent на SOURCE_TOUCHSCREEN и тип инструмента MotionEvent на TOOL_TYPE_FINGER, когда события движения передаются в приложение.

Как приложения могут достичь того же результата, что и при переопределении

Неприменимо. Проблема должна быть решена в логике приложения.

Как оптимизировать приложения

Приложение должно обрабатывать события ввода с мыши и сенсорной панели, включая жесты на сенсорной панели и прокрутку колесом мыши. Подробнее о клавиатуре, мыши и сенсорной панели…

Как отключить переопределение или отказаться от него

Объявите FEATURE_PC в элементе <uses-feature> в манифесте приложения.

<uses-feature android:name="android.hardware.type.pc"
              android:required="false" />

Примечание. Установите android:required="false", чтобы функция ПК была необязательной и Google Play не исключал приложение на устройствах, отличных от ПК.

Флаги свойств для корректировки переопределения

Нет.

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>

Примечание. Команды применяют или удаляют переопределение только временно.

FORCE_RESIZE_APP

Принудительно разрешает изменять размер окон пакетов, к которым применяется переопределение, и переходить в многооконный режим. Применяется ко всем размерам дисплеев.

Как приложения могут достичь того же результата, что и при переопределении

В манифесте приложения задайте для атрибута android:resizeableActivity значение true.

Как оптимизировать приложения

Используйте адаптивные макеты, чтобы приложения подстраивались под любые размеры и соотношения сторон экрана. Подробнее о том, как поддерживать разные размеры экранов…

Как отключить переопределение или отказаться от него

Задайте для свойства PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение и разрешить изменение размера приложения:

adb shell am compat enable FORCE_RESIZE_APP <package>

Чтобы удалить переопределение:

adb shell am compat disable FORCE_RESIZE_APP <package>

Примечание. Команды применяют или удаляют переопределение только временно.

FORCE_NON_RESIZE_APP

Принудительно запрещает изменять размер пакетов, к которым применяется переопределение, и включает режим совместимости размеров при изменении конфигурации. Применяется ко всем размерам дисплея.

Как приложения могут достичь того же результата, что и при переопределении

В манифесте приложения задайте для атрибута android:resizeableActivity и метаданных android.supports_size_changes значение false и укажите ограничение для ориентации или соотношения сторон.

Как оптимизировать приложения

Для всех приложений, которые корректно работают при изменении размера, должно быть задано значение true для атрибута android:resizeableActivity или android.supports_size_changes. Другие приложения должны быть улучшены, чтобы корректно работать при изменении размера. Подробнее об атрибуте android:resizeableActivity…

Как отключить переопределение или отказаться от него

Задайте для свойства PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение и запретить изменение размера приложения:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Чтобы удалить переопределение:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO

Переопределение, которое задает минимальное соотношение сторон.

Как приложения могут достичь того же результата, что и при переопределении

Задайте android:minAspectRatio на уровне действия или приложения.

Как оптимизировать приложения

Не устанавливайте ограничения на соотношение сторон в приложении. Убедитесь, что оно поддерживает разные размеры экрана. Используйте классы размеров окон, чтобы поддерживать разные макеты в зависимости от того, сколько места занимает ваше приложение на экране. Ознакомьтесь с документацией по Compose WindowSizeClass API и View WindowSizeClass API.

Как отключить переопределение или отказаться от него

Укажите ограничение соотношения сторон или задайте для свойства PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Ограничивает настройки приложений, которые принудительно устанавливают минимальное соотношение сторон для действий в портретной ориентации. Оно включено по умолчанию и действует, только если включено правило OVERRIDE_MIN_ASPECT_RATIO.

Как приложения могут достичь того же результата, что и переопределение

Подробнее о переопределении минимального соотношения сторон…

Как оптимизировать приложения

Подробнее об OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее об OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о переопределении минимального соотношения сторон…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_SMALL

Устанавливает минимальное соотношение сторон действия на небольшое значение (4:3).

Как приложения могут достичь того же результата, что и переопределение

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как оптимизировать приложения

Подробнее об OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Устанавливает для действия минимальное соотношение сторон со средним значением (3:2).

Как приложения могут достичь того же результата, что и при переопределении

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как оптимизировать приложения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Устанавливает для минимального соотношения сторон действия большое значение (16:9).

Как приложения могут достичь того же результата, что и при переопределении

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как оптимизировать приложения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Включает использование соотношения сторон для разделенного экрана. Позволяет приложению использовать все доступное пространство в режиме разделения экрана, избегая кашетирования.

Как приложения могут достичь того же результата, что и при переопределении

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как оптимизировать приложения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Отключает переопределение минимального соотношения сторон в полноэкранном режиме, чтобы использовать все доступное пространство экрана.

Как приложения могут достичь того же результата, что и при переопределении

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как оптимизировать приложения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Как отключить переопределение или отказаться от него

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Флаги свойств для корректировки переопределения

Подробнее о свойстве OVERRIDE_MIN_ASPECT_RATIO…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ANY_ORIENTATION

Вы можете переопределить любую ориентацию, используя следующие значения:

Как приложения могут достичь того же результата, что и при переопределении

Задайте атрибут манифеста activity:screenOrientation или используйте API Activity#setRequestedOrientation().

Как оптимизировать приложения

Приложение должно поддерживать все ориентации экрана. Изменение ориентации – это изменение конфигурации, которое можно обработать двумя способами: позволить системе закрыть и заново открыть приложение или управлять изменениями конфигурации самостоятельно. Если вы управляете изменениями конфигурации самостоятельно, состояние приложения можно сохранить с помощью ViewModel. В очень редких случаях вы можете заблокировать ориентацию только на небольших экранах, хотя это может не масштабироваться так же хорошо, как если бы пользователь мог поворачивать приложение по мере необходимости. На устройствах с Android 12L и более поздними версиями ОС фиксированная ориентация может быть переопределена конфигурацией устройства. Подробнее о том, как обрабатывать изменения конфигурации и поддерживать все ориентации, рассказывается в статьях Обработка изменений конфигурации, Обзор ViewModel и Ориентация приложения ограничена на телефонах, но не на устройствах с большим экраном.

Как отключить переопределение или отказаться от него

Задайте для свойства PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ANY_ORIENTATION_TO_USER

Позволяет приложению заполнять доступное пространство экрана. Переопределяет любые ограничения на ориентацию, изменение размера и соотношение сторон, указанные в манифесте приложения. Также игнорируются вызовы методов Activity#setRequestedOrientation() и Activity#getRequestedOrientation().

Как приложения могут достичь того же результата, что и при переопределении

  • Не задавайте атрибут манифеста android:screenOrientation или задайте для него значение "user".

  • Задайте для атрибута манифеста android:resizeableActivity значение true.

  • Чтобы на небольших экранах можно было изменять размер приложения, но при этом был отключен многооконный режим с помощью android:resizeableActivity=false, установите для флага метаданных android.supports_size_changes значение true. Не задавайте значения minAspectRatio и maxAspectRatio.

Как оптимизировать приложения

Включите поддержку всех ориентаций экрана в приложении. Не указывайте параметр screenOrientation в манифесте приложения. Чтобы приложение поддерживало изменение размера, многооконный режим и все соотношения сторон экрана, задайте для атрибута android:resizeableActivity в манифесте приложения значение true. Подробнее о том, как поддерживать разные размеры экрана…

Как отключить переопределение или отказаться от него

Подробнее OVERRIDE_ANY_ORIENTATION…

Флаги свойств для корректировки переопределения

Подробнее OVERRIDE_ANY_ORIENTATION…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Включает книжную ориентацию для всех действий в пакете. Если не включен параметр OVERRIDE_ANY_ORIENTATION, переопределение используется, только когда в действии не указана другая фиксированная ориентация.

Как приложения могут достичь того же результата, что и переопределение

Подробнее OVERRIDE_ANY_ORIENTATION…

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Подробнее OVERRIDE_ANY_ORIENTATION…

Флаги свойств для корректировки переопределения

Подробнее OVERRIDE_ANY_ORIENTATION…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Включает ориентацию nosensor для всех действий в пакете. Если не включено свойство OVERRIDE_ANY_ORIENTATION, переопределение используется, только когда в действии не указана другая фиксированная ориентация.

Как приложения могут достичь того же результата, что и при переопределении

Подробнее OVERRIDE_ANY_ORIENTATION…

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Подробнее OVERRIDE_ANY_ORIENTATION…

Флаги свойств для корректировки переопределения

Подробнее OVERRIDE_ANY_ORIENTATION…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Включает ориентацию reverseLandscape для всех действий в пакете. Если не включено свойство OVERRIDE_ANY_ORIENTATION, переопределение используется, только когда в действии не указана другая фиксированная ориентация.

Как приложения могут достичь того же результата, что и при переопределении

Подробнее OVERRIDE_ANY_ORIENTATION…

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Подробнее OVERRIDE_ANY_ORIENTATION…

Флаги свойств для корректировки переопределения

Подробнее OVERRIDE_ANY_ORIENTATION…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Ограничения Переопределения OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR и OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE действуют, только когда подключение к камере активно.

Как приложения могут достичь того же результата, что и при переопределении

Подробнее OVERRIDE_ANY_ORIENTATION…

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Подробнее OVERRIDE_ANY_ORIENTATION…

Флаги свойств для корректировки переопределения

Подробнее OVERRIDE_ANY_ORIENTATION…

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Ограничивает ориентацию дисплея горизонтальной, если выполняются следующие условия:

  • Занятие открыто на весь экран.
  • Свойство компонента Opt out component property PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE не включено.
  • Производитель устройства включил настройку, которая позволяет игнорировать запрос ориентации для экрана.
  • Естественная ориентация экрана – горизонтальная.

Как приложения могут достичь того же результата, что и при переопределении

Неприменимо. Проблема должна быть решена в логике приложения.

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Задайте для свойства PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Включает правило совместимости, которое пропускает обновление ориентации приложения в ответ на вызов Activity#setRequestedOrientation(), когда приложение перезапускается или имеет активную обработку совместимости камеры.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION значение true.

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Включает правило совместимости, которое игнорирует запрошенную приложением ориентацию в ответ на вызов Activity#setRequestedOrientation() более двух раз за одну секунду, если для действия не используется кашетирование для фиксированной ориентации.

Как приложения могут достичь того же результата, что и при переопределении

Неприменимо. Проблема должна быть решена в логике приложения.

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Задайте для свойства PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Исключает пакеты из поведения, при котором игнорируется запрос ориентации. Это поведение может быть включено производителями устройств для области экрана или всего экрана.

Как приложения могут достичь того же результата, что и при переопределении

Неприменимо. Проблема должна быть решена в логике приложения.

Как оптимизировать приложения

Подробнее OVERRIDE_ANY_ORIENTATION…

Как отключить переопределение или отказаться от него

Без возможности отказа. Отключение переопределения может быть опасным, если приложение несовместимо с устройством, на котором включен параметр игнорирования запроса ориентации от производителя устройства. Чтобы отключить переопределение, обратитесь в службу поддержки разработчиков Android.

Флаги свойств для корректировки переопределения

Для этого переопределения нет флагов свойств.

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

NEVER_SANDBOX_DISPLAY_APIS

Запрещает применять изолированную среду API Display к пакетам для действий в режиме совместимости размеров или кашетирования. API Display по-прежнему предоставляют границы области отображения.

Как приложения могут достичь того же результата, что и при переопределении

Укажите, что размер действий можно изменять. Для этого задайте атрибуту манифеста android:resizeableActivity значение true или флагу метаданных android.supports_size_changes значение true.

Как оптимизировать приложения

Приложения, которые заявляют, что полностью поддерживают изменение размера, не должны полагаться на размер экрана при размещении элементов интерфейса. Переведите приложение на современные API, которые обеспечивают WindowMetrics. Если вы используете Jetpack Compose, воспользуйтесь API WindowSizeClass, чтобы отрисовать интерфейс в зависимости от того, сколько места на экране занимает приложение. Подробнее о том, как использовать классы размеров окон…

Как отключить переопределение или отказаться от него

Без возможности отказа. Перейдите на новые API.

Флаги свойств для корректировки переопределения

Для этого переопределения нет флагов свойств.

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Чтобы удалить переопределение:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Примечание. Команды применяют или удаляют переопределение только временно.

ALWAYS_SANDBOX_DISPLAY_APIS

Принудительно применяет изолированную среду API Display к пакетам независимо от режима окон. API Display всегда предоставляют границы приложения.

Как приложения могут достичь того же результата, что и при переопределении

Чтобы запретить изменение размера, задайте для атрибута android:resizeableActivityfalse или метаданных android.supports_size_changes значение false.

Как оптимизировать приложения

Приложения, которые заявляют, что они полностью масштабируемы, никогда не должны полагаться на размер дисплея для позиционирования элементов пользовательского интерфейса. Перенесите свое приложение с устаревших API на современные, которые обеспечивают WindowMetrics. Подробнее WindowMetricsCalculator…

Как отключить переопределение или отказаться от него

Без возможности отказа. Перейдите на новые API.

Флаги свойств для корректировки переопределения

Для этого переопределения нет флагов свойств.

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Чтобы удалить переопределение:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Принудительно изолирует следующие API View в границах действия:

Как приложения могут достичь того же результата, что и при переопределении

Чтобы устранить проблему в коде приложения, используйте API, которые предоставляют границы окна приложения и смещения относительно окна приложения, а не границы экрана устройства и смещения относительно экрана устройства.

Как оптимизировать приложения

Приложения должны использовать API View с учетом того, что к ним могут применяться кашетирование и многооконный режим. Подробнее WindowMetricsCalculator…

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Отключает принудительный поворот. Повышает удобство использования некоторых приложений.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION значение false.

Как оптимизировать приложения

Не полагайтесь на кешированные данные об ориентации датчика камеры или информацию об устройстве. Рекомендации по совместимости камер можно найти в статьях Знакомство с видоискателем камеры и Поддержка масштабируемых поверхностей в приложении камеры.

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION значение true.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение, которое отменяет принудительную ротацию, выполните следующие действия:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Чтобы удалить переопределение и разрешить принудительную ротацию, выполните следующие действия:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION

Отключает симуляцию запрошенной ориентации для камеры. Улучшает работу некоторых приложений.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION значение false.

Как оптимизировать приложения

Не полагайтесь на кешированные данные об ориентации датчика камеры или информацию об устройстве. Рекомендации по совместимости камер можно найти в статьях Знакомство с видоискателем камеры и Поддержка изменяемых поверхностей в приложении камеры.

Как отключить переопределение или отказаться от него

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

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение, которое отключает симуляцию запрошенной ориентации:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

Чтобы удалить переопределение и разрешить симуляцию запрошенной ориентации, выполните следующие действия:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Отключает обновление действий после принудительного поворота. Улучшает пользовательский опыт, когда обновление приводит к потере состояния в приложениях.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH значение false.

Как оптимизировать приложения

Подробнее: OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH значение true.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение, которое удаляет обновление активности:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Чтобы удалить переопределение и разрешить обновление активности, выполните следующие действия:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Применяется к пакетам, чтобы они обновляли действия, используя цикл onResume() → onPause() → onResume(), а не onResume() → onStop() → onResume() после принудительного поворота для совместимости с камерой.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE значение true.

Как оптимизировать приложения

Подробнее: OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Принудительно обрезает изображение с камеры до противоположной ориентации, если портретная ориентация камеры не совпадает с естественной ориентацией устройства. Многие приложения не учитывают эту особенность, и изображения в них растягиваются.

Как приложения могут достичь того же результата, что и при переопределении

Установите для флага свойства PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT значение true.

Как оптимизировать приложения

Подробнее: OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Как отключить переопределение или отказаться от него

Установите для флага свойства PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение, которое включает кадрирование внутренней фронтальной камеры:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Чтобы удалить переопределение и отключить кадрирование внутренней фронтальной камеры:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Запрещает приложениям отключать демонстрацию экрана (см. Проекция медиаконтента). Оно было реализовано, поскольку приложения злоупотребляли API createConfigForDefaultDisplay(), чтобы принудительно записывать весь экран. Это ставило под угрозу конфиденциальность пользователей, так как в запись попадало содержимое уведомлений и всех приложений независимо от режима окон.

Как приложения могут достичь того же результата, что и при переопределении

Разрешите поведение по умолчанию для проекции медиаданных (реализовано в Android 14, уровень API 34, с createScreenCaptureIntent()). Это позволит пользователям выбирать, показывать ли полноэкранный режим или только одно окно приложения, независимо от режима обработки методом окна. Или вызовите createScreenCaptureIntent(MediaProjectionConfig) с аргументом MediaProjectionConfig, возвращенным из вызова createConfigForUserChoice().

Как оптимизировать приложения

Разрешить пользователям выбирать, что показывать во время проекции медиаданных: весь экран устройства или окно приложения. В Android 14 это режим работы по умолчанию.

Чтобы приложение поддерживало многооконный режим, сделайте так, чтобы размер его окна можно было изменять (resizeableActivity="true").

Как отключить переопределение или отказаться от него

Поскольку конфиденциальность пользователей очень важна, в приложении нельзя отключить это переопределение.

Флаги свойств для корректировки переопределения

Нет.

Команды adb для тестирования переопределения

Чтобы применить переопределение, которое отменяет отказ приложения от демонстрации части экрана (то есть включает ее):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Чтобы удалить переопределение, которое позволяет приложению отказаться от демонстрации части экрана:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Включает отправку ложного фокуса для приложений, которые не находятся в фокусе в режиме разделенного экрана. Некоторые игровые движки ждут получения фокуса, прежде чем отрисовывать контент приложения. Ложный фокус помогает приложениям избежать черного экрана при возобновлении работы, когда фокус ещё не получен.

Как приложения могут достичь того же результата, что и при переопределении

Задайте для свойства PROPERTY_COMPAT_ENABLE_FAKE_FOCUS значение true.

Как оптимизировать приложения

Чтобы избежать этой проблемы, убедитесь, что ваше приложение поддерживает разные ориентации экрана и изменения конфигурации. Чтобы ваше приложение поддерживало все типы устройств и режимы окон, следуйте рекомендациям по обеспечению качества адаптивных приложений.

Если вы используете игровой движок Unity, обновите его до версии 2019.4.40 или более поздней и повторно экспортируйте игру. В настройках Android Player оставьте флажок Resizable Window (Окно с изменяемым размером) установленным.

Как отключить переопределение или отказаться от него

Задайте для флага свойства PROPERTY_COMPAT_ENABLE_FAKE_FOCUS значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Примечание. Команды применяют или удаляют переопределение только временно.

OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

Исключает вставки строки заголовка из границ приложения в конфигурации действия в многооконном режиме. Это предотвращает перекрытие элементов интерфейса приложения вверху или внизу строкой заголовка или их обрезку, если приложение не обрабатывает вставки строки заголовка.

Обычно вставки строки заголовка не исключаются из границ приложения в конфигурации, а Configuration.screenHeightDp и границы приложения сообщают полную высоту окна, включая область за строкой заголовка многооконного режима (строка заголовка с элементами управления сворачиванием, разворачиванием и закрытием, которая остается видимой даже в режиме погружения):

  • Полноэкранные приложения, которые не обрабатывают отступы строки заголовка. Макет приложения занимает все окно, поэтому если приложение не запрашивает WindowInsets для смещения интерфейса, верхние элементы управления могут отображаться прямо под строкой заголовка.
  • Приложения, в которых система принудительно использует вставки строки заголовка. Чтобы приложение не отрисовывалось за строкой заголовка, система сдвигает корневое представление приложения вниз под строку заголовка. Если приложение определяет размер макета, используя нескорректированное значение Configuration.screenHeightDp или границы приложения, а не размеры области просмотра, то макет будет отображаться на всю высоту окна, начиная с области под строкой заголовка. В результате элементы интерфейса будут выходить за нижний край окна, а области прикосновения будут смещены.

Когда переопределение включено, система вычитает высоту строки заголовка из границ приложения и Configuration.screenHeightDp, чтобы область макета приложения совпадала с пространством под строкой заголовка.

Как приложения могут достичь того же результата, что и при переопределении

Включить отображение от края до края. Ознакомьтесь со следующими статьями:

Как оптимизировать приложения

Чтобы избежать этой проблемы, включите в приложении режим "от края до края".

Как отключить переопределение или отказаться от него

Задайте для флага свойства PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS значение false.

Флаги свойств для корректировки переопределения

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS"
  android:value="true|false"/>

Команды adb для тестирования переопределения

Чтобы применить переопределение:

adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

Чтобы удалить переопределение:

adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

Примечание. Команды применяют или удаляют переопределение только временно.

Дополнительные ресурсы


  1. Владелец виртуального устройства – это надежное или привилегированное приложение, которое управляет виртуальным устройством. Владельцы виртуальных устройств создают их, чтобы отрисовывать приложения и затем проецировать их на удаленные устройства, например персональные компьютеры, устройства виртуальной реальности или информационно-развлекательные системы автомобилей. Владелец виртуального устройства использует локальное устройство, например телефон. ↩