Android активирует режим совместимости для приложений, устанавливающих ограничения на ориентацию или изменение размера. Режим совместимости обеспечивает приемлемое поведение приложений на устройствах с большим экраном и складных телефонах-раскладушках, но с неоптимальным удобством использования.
Переопределения для каждого приложения позволяют производителям устройств, владельцам виртуальных устройств 1 и пользователям изменять поведение приложения, чтобы улучшить его макет или предотвратить сбои в работе приложений на выбранных устройствах.
Андроид 16
Android 16 (уровень API 36) игнорирует ограничения по ориентации экрана, соотношению сторон и изменению размера приложений, чтобы улучшить компоновку приложений на форм-факторах с наименьшей шириной >= 600dp.
Следующие переопределения для каждого приложения не работают для приложений, ориентированных на API уровня 36:
- FORCE_RESIZE_APP
- FORCE_NON_RESIZE_APP
- OVERRIDE_MIN_ASPECT_RATIO
- OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
- OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
- OVERRIDE_MIN_ASPECT_RATIO_LARGE
- OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
- OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
- ПЕРЕОПРЕДЕЛИТЬ_ЛЮБУЮ_ОРИЕНТАЦИЮ
- OVERRIDE_ANY_ORIENTATION_TO_USER
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
- OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
- OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
- OVERRIDE_RESPECT_REQUESTED_ORIENTATION
- OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
Уклоняться
Ваше приложение может быть ориентировано на 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>
Справочные устройства
Для следующих устройств может потребоваться переопределение настроек для каждого приложения из-за необычных конфигураций или конфигураций, которые плохо поддерживаются приложениями:
- Планшеты: естественная ориентация некоторых планшетов, таких как Pixel Tablet, — альбомная. Устройство находится в естественной ориентации, когда
Display#getRotation()возвращаетSurface.ROTATION_0. Если приложения предполагают, чтоROTATION_0— портретная ориентация, макеты приложений и предварительный просмотр с камеры могут не соответствовать дисплею устройства. - Складные устройства с альбомной ориентацией: некоторые складные устройства, такие как Pixel Fold, в сложенном состоянии имеют портретную ориентацию, а в разложенном — альбомную. Если приложения считают, что в разложенном состоянии портретная ориентация, вероятно появление мерцающих зацикливаний или проблем с компоновкой.
- Складные раскладушки: Разложенные раскладушки обычно имеют портретную ориентацию. В сложенном состоянии они обычно имеют небольшой дисплей в альбомной ориентации. Приложения должны распознавать и адаптироваться к различным ориентациям дисплеев.
- Внешние дисплеи: Некоторые устройства могут запускать сеанс работы с окнами рабочего стола на внешних подключенных дисплеях. Приложения должны запрашивать у внешних дисплеев информацию, такую как размер и разрешение экрана; в противном случае приложения могут делать неверные предположения о дисплеях, что может привести к некорректному поведению приложений.
- Автомобильные дисплеи: Многие, но не все, автомобильные дисплеи имеют альбомную ориентацию. Разработка приложений для парковки автомобилей похожа на разработку для планшетов.
Распространенные проблемы совместимости
Чаще всего проблемы с совместимостью возникают из-за ограничений ориентации приложения, ограничений изменения размера и соотношения сторон, неправильной обработки ориентации предварительного просмотра камеры и неправильного использования API.
Леттербоксинг
Почтовый ящик (Letterboxing) размещает приложение по центру экрана или, на больших экранах, сбоку для удобства доступа. Матовые фоны (однотонные полосы или размытые обои) заполняют неиспользуемую область экрана по бокам или сверху и снизу приложения.
Эффект «леттербоксинга» часто встречается на устройствах с большим экраном, поскольку размеры и соотношение сторон дисплея устройства обычно отличаются от таковых у стандартных телефонов, для которых разработано большинство приложений.

Рисунок 1. Приложение, ограниченное портретной ориентацией, отображается в формате Letterbox на планшете с альбомной ориентацией и является складным.
Проблема
Приложение не поддерживает все конфигурации дисплея, поскольку имеет фиксированную ориентацию, фиксированное соотношение сторон или не позволяет изменять размер.
Параметры конфигурации, управляющие ориентацией и изменением размера приложения, включают следующее:
screenOrientation: задаёт фиксированную ориентацию для приложения. Приложения также могут задавать ориентацию во время выполнения с помощьюActivity#setRequestedOrientation().resizeableActivity: Указывает, может ли система изменять размер приложений для соответствия окнам различных размеров. В Android 11 (уровень API 30) и ниже определяет, поддерживают ли приложения многооконный режим. В Android 12 (уровень API 31) и выше определяет, поддерживают ли приложения многооконный режим на маленьких экранах ( класс размера окна «compact» ). В Android 12 и выше приложения поддерживают многооконный режим на больших экранах (класс размера окна «medium» или «expanded») независимо от этой настройки.maxAspectRatio: определяет максимальное соотношение сторон, поддерживаемое приложением. Только приложения, у которыхresizeableActivityустановлен вfalseмогут устанавливатьmaxAspectRatio.minAspectRatio: определяет минимальное соотношение сторон, поддерживаемое приложением. Только приложения, у которыхresizeableActivityустановлен вfalseмогут устанавливатьminAspectRatio.

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

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

Рисунок 2. Приложение Letterboxed с улучшениями пользовательского интерфейса.
12L (уровень API 32) добавляет следующие функциональные улучшения:
Настраиваемое позиционирование: на больших экранах производители устройств могут расположить приложение в левой или правой части дисплея, что упрощает взаимодействие.
Измененный дизайн кнопки перезапуска: производители устройств могут придать кнопке перезапуска для режима совместимости размеров новый вид для лучшей узнаваемости пользователями.
В Android 13 (уровень API 33) добавлен диалог обучения пользователя по размещению приложения в формате Letterbox на экране или включению Letterbox в режим разделения экрана:

Рисунок 3. Приложение с почтовым ящиком и диалоговым окном обучения пользователя.
Режим совместимости размеров
Режим совместимости размеров — это режим «почтового ящика», сохраняющий соотношение сторон приложения и включающий элемент управления перезапуском. Этот элемент управления позволяет пользователям перезапускать приложение и перерисовывать экран. Android использует режим совместимости размеров для приложений, размер которых не может быть изменён. Когда действие перемещается в контейнер отображения, несовместимый с размерами действия, система может изменить масштаб приложения, чтобы заполнить экран устройства как минимум в одном измерении.
Изменения конфигурации устройства, которые могут вызвать режим совместимости размеров, включают в себя следующее:
- Вращение устройства
- Складное устройство, складывающееся или раскладывающееся
- Переключение между полноэкранным и разделенным экранным режимами отображения
Проблема
Режим совместимости размеров обычно применяется к действиям, которые ограничены по ориентации или соотношению сторон и настроены (или определены системой) как не подлежащие изменению размера.
Ваше приложение считается допускающим изменение размера и не будет переведено в режим совместимости по размеру, если оно соответствует любому из следующих критериев:
- Можно изменить размер с помощью
resizeableActivity="true" - Поддерживает режим «картинка в картинке» (PIP)
- Встроено
- Применяется ли производителем устройства переопределение
FORCE_RESIZE_APPдля каждого приложения (свойства, заданные приложением, игнорируются)
Если ваше приложение не соответствует ни одному из условий, оно считается не подлежащим изменению размера и может быть переведено в режим совместимости размеров.

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

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

Приложение, работающее только в портретной ориентации, переведено в горизонтальную ориентацию, масштаб изменен с помощью управления перезапуском.
Режим совместимости дисплея
Режим совместимости дисплеев предотвращает перезапуск приложения при перемещении между разными дисплеями, что может привести к изменению конфигурации, например цветового режима , доступности сенсорного экрана или плотности экрана .
Режим совместимости с дисплеем по умолчанию включён для игр (на основе флага 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() .
Оптимизация
Приложения не должны делать следующее:
- Установите ориентацию по умолчанию с помощью
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 также обрезает изображение с сенсора камеры, если сенсор ориентирован в альбомной ориентации, а предварительный просмотр камеры — в портретной. Конкретные обходные пути включают следующее:
Принудительный поворот камеры в приложениях с ограничением по портретной ориентации: приложения, ограниченные портретной ориентацией, ожидают, что устройство и датчик камеры будут иметь портретную ориентацию. Однако на 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 предназначены для специальных целей, которые не всегда понятны разработчикам.
Проблема
Разработчики продолжают использовать устаревшие API Display и ошибочно предполагают, что эти API возвращают границы приложения, а не границы области отображения устройства. Или же разработчики ошибочно используют специализированные API представлений для получения общих показателей отображения. В результате возникают ошибки в расчётах при изменении положения элементов пользовательского интерфейса после событий изменения размера окна приложения, что приводит к проблемам с компоновкой.
Устаревшие и часто неправильно используемые API отображения:
Более подробную информацию см. в разделе Поддержка многооконного режима .
Неправильно используемые API представлений:

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

API корректно рассчитывает метрики окна приложения.
Обходной путь совместимости
Два переопределения настраивают устаревшие 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 , могут включать стили, которые делают действия прозрачными.
Прозрачные действия не охватывают все доступное пространство дисплея, что затрудняет управление ими, поскольку доступная область отображения может меняться в зависимости от изменений конфигурации, таких как поворот устройства, складывание и раскладывание устройства, а также многооконный режим.
Проблема
Прозрачная активность должна соответствовать границам первой непрозрачной активности, расположенной ниже прозрачной активности в стеке задач. Однако непрозрачная активность, запускающая диалоговое окно разрешения, может быть батутом (активностью, которая запускает другую активность, а затем исчезает); поэтому система не может определить границы активности-батута, которая запустила прозрачную активность диалогового окна разрешения.

Диалог смещен, поскольку действие было запущено с батута.
Оптимизация
Прозрачные активности наследуют ограничения от самой верхней непрозрачной активности, расположенной под ними в стеке активностей задачи. Непрозрачная активность должна быть доступна на протяжении всего жизненного цикла прозрачной активности, от создания до удаления. По этой причине не отправляйте запросы разрешений из активностей-батутов.
Если действие батута запускает запрос на разрешение, пользователь может не увидеть диалоговое окно разрешения, поскольку действие батута будет уничтожено до того, как пользователь успеет ответить на диалог, а размеры и положение действия диалога могли быть рассчитаны неправильно.
Приложения всегда должны запускать запросы на разрешения из действий, которые остаются видимыми до тех пор, пока пользователь не примет решение о предоставлении разрешения.
Закругленные углы
Активность может быть прозрачной из-за стиля, определяющего прозрачность фона, или из-за того, что содержимое активности не заполняет доступное пространство экрана. Если прозрачная активность заполняет доступное пространство экрана, система автоматически применяет к ней скругленные углы, если это настроено производителем устройства. Однако если прозрачная активность (например, диалоговое окно с разрешением) не заполняет доступное пространство, вы сами решаете, применять скругленные углы или нет.
Диалоги разрешений не заполняют доступное пространство экрана, поскольку макет диалога обычно использует LayoutParams.WRAP_CONTENT, а не LayoutParams.MATCH_PARENT .

Диалог со скругленными углами правильно расположен над видимой активностью запуска.
Обходной путь совместимости
Сохраняйте действия, запускающие диалоговые действия, видимыми до тех пор, пока пользователь не ответит на диалог.
Система гарантирует, что прозрачная активность наследует все ограничения от первой непрозрачной активности, находящейся под прозрачной активностью в стеке активностей, включая ограничения, связанные с:
- Режим совместимости размеров
- Ориентация
- Соотношение сторон
Unity-игры
Игры Unity на Android работают в полноэкранном режиме или в многооконном режиме. Однако многие игры Unity теряют фокус и перестают отображать контент при переходе приложения в многооконный режим.
Проблема
В Unity 2019.4 появилась опция Resizable Window для поддержки многооконного режима на Android. Однако первоначальная реализация некорректно реагировала на жизненный цикл активности в многооконном режиме , из-за чего UnityPlayer приостанавливал воспроизведение при потере фокуса. Игрок отображал чёрный экран или последний замороженный кадр игры. Игровой процесс возобновлялся только после касания экрана пользователем. Многие приложения, использующие движок Unity, сталкиваются с этой проблемой и отображают чёрное окно в многооконном режиме.

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

Игра корректно отображает контент в многооконном режиме, даже если он не находится в фокусе.
Обходной путь совместимости
Производители устройств могут применять переопределение OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS для каждого приложения, чтобы обеспечить ложное событие фокусировки для приложения в многооконном режиме. Это переопределение позволяет приложению перерисовывать контент, не затемняя его.
Оконный режим рабочего стола
При запуске приложений в оконной среде рабочего стола могут возникать дополнительные режимы совместимости.
Размер приложений с заблокированной ориентацией можно свободно изменять. Даже если действие заблокировано в портретной ориентации , пользователи всё равно могут изменить размер приложения на альбомную.

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

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

Изменение размера окна с помощью видоискателя камеры
Проверьте свое приложение на наличие проблем совместимости
Чтобы протестировать свое приложение и понять, как оно ведет себя на устройствах разных форм-факторов, воспользуйтесь следующими ресурсами:
- Потоковая передача данных с устройств: чтобы протестировать приложение на производственных устройствах (включая эталонные устройства ), размещенных в центрах обработки данных Google, ознакомьтесь с разделом Потоковая передача данных с устройств Android на базе Firebase.
- Эмуляторы в Android Studio: информацию о создании эмуляторов для эталонных устройств см. в разделе Создание и управление виртуальными устройствами.
- Эмулятор Android Studio с изменяемым размером: информацию о доступе к виртуальным устройствам см. в разделе Запуск приложений на эмуляторе Android.
Имеет почтовый ящик
Убедитесь, что каждое действие может использовать всё доступное приложению пространство экрана. Сначала объявите следующий код в тестовой папке:
Котлин
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() } }
Ява
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(); }
Затем запустите тест, чтобы подтвердить поведение и убедиться, что целевая активность не ограничена:
Котлин
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Ява
@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>
В таблице ниже перечислены доступные переопределения, а также даны рекомендации по оптимизации приложения, чтобы оно не зависело от переопределений. Вы можете добавить флаги свойств в манифест приложения, чтобы отказаться от некоторых переопределений.
| Переопределения для каждого приложения | |||
|---|---|---|---|
| Тип | Имя | ИДЕНТИФИКАТОР | Описание |
| Возможность изменения размера | FORCE_RESIZE_APP | 174042936 | Обходит режим совместимости размеров приложения при изменении конфигурации. |
| FORCE_NON_RESIZE_APP | 181136395 | Переводит приложение в режим совместимости размеров при изменении конфигурации. | |
| Соотношение сторон | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Переопределение Gatekeeper, которое должно быть включено для применения любых других переопределений соотношения сторон. |
| 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 | Changes the minimum aspect ratio to fit 50% of the display size (or split-screen aspect ratio). | |
| OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Disables the minimum aspect ratio override so that apps are full screen when device is portrait. | |
| Ориентация | OVERRIDE_ANY_ORIENTATION | 265464455 | Enables overriding any orientation. |
| OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | Overrides orientation, resizability, and aspect ratio restrictions. | |
| OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Overrides the orientation to be portrait when an activity has an undefined orientation. | |
| OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Overrides the orientation to be nosensor (use the natural orientation of device) when an activity has an undefined orientation. | |
| OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Rotates landscape-only apps 180 degrees. | |
| OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Limits orientation override scope to when app is connected to the camera. | |
| OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Sets the display to fixed landscape natural orientation when a task is full screen (including when letterboxed). | |
| OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignores orientation requests from app to avoid rotation infinite loops. | |
| OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Ignores repeated orientation requests while an activity is relaunching. If Android detects an app is requesting at least two new orientations within one second, the system considers this a rotation infinite loop and applies the override. | |
| OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Prevents letterboxing by disabling the device manufacturer ignore orientation request setting. | |
| Sandbox APIs | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Prevents changing the behavior of any display APIs. |
| ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Forces the Display APIs in the app to return app bounds. Display APIs return logical display area bounds, but sometimes the app assumes Display APIs return app bounds, which leads to UI issues. | |
| OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Forces the View APIs used in the app to return app bounds. View APIs return logical display area bounds, but sometimes the app assumes View APIs return app bounds, which leads to UI issues. | |
| Camera compat | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Turns off force rotation. By default, all fixed-orientation camera apps are force rotated when the camera preview is open. |
| OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Removes the default hard refresh applied when a camera preview is force rotated. | |
| OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Switches the hard refresh to a soft refresh when a camera preview is force rotated, which helps preserve state during the force rotation. By default, Android applies a hard refresh when the camera preview is force rotated. The hard refresh can cause issues with apps losing state or blacking out depending on how the apps cached their previous state. | |
| OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Crops the image buffer of the inner front camera. If the override is disabled, the inner front camera cropping is removed and the field of view of the camera preview is increased. By default on some foldables (see reference devices ), the system crops the camera preview of all camera apps when using the inner front camera. | |
| Разнообразный | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Prevents the app from being blacked out when the app loses focus in split-screen mode. App waits for focus before drawing the app content, which can cause the app to freeze or be blacked out. The override enables Android to send a fake focus event to the app, which signals to the app to begin drawing content again. |
FORCE_RESIZE_APP
Forces the packages to which the override is applied to be resizable and able to enter multi‑window mode. Applies to all displays sizes.
How apps can achieve same result as override
In the app manifest, set the android:resizeableActivity attribute to true .
How to optimize apps
Use responsive/adaptive layouts to enable apps to adapt to all display sizes and aspect ratios. See Support different display sizes .
How to disable or opt out of override
Set the property flag PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
adb commands to test override
To apply the override and make app resizable:
adb shell am compat enable FORCE_RESIZE_APP <package>
To remove the override:
adb shell am compat disable FORCE_RESIZE_APP <package>
Note: The commands only temporarily apply or remove the override.
FORCE_NON_RESIZE_APP
Forces the packages to which the override is applied to be nonresizable and enter size compatibility mode on configuration changes. Applies to all display sizes.
How apps can achieve same result as override
Set both the android:resizeableActivity attribute and android.supports_size_changes metadata flag to false in the app manifest, and declare either an orientation or aspect ratio restriction.
How to optimize apps
All apps that behave well if resized should either have android:resizeableActivity or android.supports_size_changes set to true . Other apps should be improved to behave well when resized. See android:resizeableActivity .
How to disable or opt out of override
Set the property flag PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
adb commands to test override
To apply the override and make app nonresizable:
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
To remove the override:
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO
The gatekeeper for all overrides that force a given minimum aspect ratio.
How apps can achieve same result as override
Set android:minAspectRatio at the activity or app level.
How to optimize apps
Don't set aspect ratio restrictions in your app. Make sure your app supports different display sizes . Use window size classes to support different layouts based on the amount of space your app has on the screen. See the Compose WindowSizeClass API and View WindowSizeClass API .
How to disable or opt out of override
Specify an aspect ratio restriction or set the property flag PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Restricts app settings that force a given minimum aspect ratio for activities with portrait‑only orientation. Enabled by default and only takes effect if OVERRIDE_MIN_ASPECT_RATIO is also enabled.
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_SMALL
Sets the activity's minimum aspect ratio to a small value (4:3).
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Sets the activity's minimum aspect ratio to a medium value (3:2).
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_LARGE
Sets the activity's minimum aspect ratio to a large value (16:9).
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Enables the use of split-screen aspect ratio. Allows an app to use all the available space in split-screen mode, avoiding letterboxing.
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Disables the minimum aspect ratio override in portrait full screen to use all available screen space.
How apps can achieve same result as override
See OVERRIDE_MIN_ASPECT_RATIO .
How to optimize apps
See OVERRIDE_MIN_ASPECT_RATIO .
How to disable or opt out of override
See OVERRIDE_MIN_ASPECT_RATIO .
Property flags to adjust override
See OVERRIDE_MIN_ASPECT_RATIO .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
To remove the override:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ANY_ORIENTATION
Enables the following overrides to override any orientation:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
How apps can achieve same result as override
Set the activity:screenOrientation manifest attribute, or use the Activity#setRequestedOrientation() API.
How to optimize apps
Your app should support all orientations. An orientation change is a configuration change, which can be handled either of two ways: letting the system destroy and recreate the app, or managing the configuration changes yourself. If you manage configuration changes yourself, the app state can be retained by using ViewModel . In very limited cases, you can decide to lock the orientation on small displays only, although doing so might not scale as well as letting the user rotate the app as needed. On Android 12L and higher versions, fixed orientation can be overridden by device configuration. For more information about handling configuration changes and supporting all orientations, see Handle configuration changes , ViewModel overview , and App orientation restricted on phones but not on large screen devices .
How to disable or opt out of override
Set the property flag PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
To remove the override:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ANY_ORIENTATION_TO_USER
Enables app to fill the available display space. Overrides any orientation, resizability, and aspect ratio restrictions specified in the app manifest. Also ignores any calls to Activity#setRequestedOrientation() or Activity#getRequestedOrientation() .
How apps can achieve same result as override
Do not set the
android:screenOrientationmanifest attribute, or set the attribute to"user".Set the
android:resizeableActivitymanifest attribute totrue.On small screens, to support app resizing while disabling multi‑window mode with
android:resizeableActivity=false, set theandroid.supports_size_changesmetadata flag totrue. Do not setminAspectRatioandmaxAspectRatio.
How to optimize apps
Enable your app to support all orientations; don't set a screenOrientation specification in your app's manifest. Support app resizability, multi‑window mode, and all display aspect ratios by setting the android:resizeableActivity attribute in your app's manifest to true . See Support different display sizes .
How to disable or opt out of override
See OVERRIDE_ANY_ORIENTATION .
Property flags to adjust override
See OVERRIDE_ANY_ORIENTATION .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
To remove the override:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
Enables portrait orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.
How apps can achieve same result as override
See OVERRIDE_ANY_ORIENTATION .
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
See OVERRIDE_ANY_ORIENTATION .
Property flags to adjust override
See OVERRIDE_ANY_ORIENTATION .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
To remove the override:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Enables nosensor orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.
How apps can achieve same result as override
See OVERRIDE_ANY_ORIENTATION .
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
See OVERRIDE_ANY_ORIENTATION .
Property flags to adjust override
See OVERRIDE_ANY_ORIENTATION .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
To remove the override:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Enables reverseLandscape orientation for all activities in the package. Unless OVERRIDE_ANY_ORIENTATION is enabled, the override is used only when no other fixed orientation has been specified by the activity.
How apps can achieve same result as override
See OVERRIDE_ANY_ORIENTATION .
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
See OVERRIDE_ANY_ORIENTATION .
Property flags to adjust override
See OVERRIDE_ANY_ORIENTATION .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
To remove the override:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
Limits OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT , OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR , and OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE overrides to take effect only when camera connection is active.
How apps can achieve same result as override
See OVERRIDE_ANY_ORIENTATION .
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
See OVERRIDE_ANY_ORIENTATION .
Property flags to adjust override
See OVERRIDE_ANY_ORIENTATION .
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
To remove the override:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Restricts display orientation to landscape natural orientation when the following conditions are met:
- Activity is full screen
- Opt out component property
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDEisn't enabled - Device manufacturer ignore orientation request setting is enabled for the display
- Natural orientation of the display is landscape
How apps can achieve same result as override
Not applicable. The problem should be solved in the application logic.
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
Set the property flag PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
To remove the override:
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Enables compat policy that skips updating app orientation in response to app calling Activity#setRequestedOrientation() when app is relaunching or has an active camera compat treatment.
How apps can achieve same result as override
Set property flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION to true .
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
Set property flag PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
To remove the override:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Enables the compatibility policy that ignores an app's requested orientation in response to the app calling Activity#setRequestedOrientation() more than twice in one second if an activity is not letterboxed for fixed orientation.
How apps can achieve same result as override
Not applicable. The problem should be solved in the application logic.
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
Set property flag PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
To remove the override:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Excludes packages from ignore orientation request behavior that can be enabled by device manufacturers for a display area or the whole display.
How apps can achieve same result as override
Not applicable. The problem should be solved in the application logic.
How to optimize apps
See OVERRIDE_ANY_ORIENTATION .
How to disable or opt out of override
No opt-out. Disabling the override can be dangerous if the app is not compatible with a device that has the device manufacturer ignore orientation request setting enabled. Contact Android Developer Relations to disable the override.
Property flags to adjust override
No property flags for this override.
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
To remove the override:
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Note: The commands only temporarily apply or remove the override.
NEVER_SANDBOX_DISPLAY_APIS
Forces packages to never have Display API sandboxing applied for a letterboxed or size compatibility mode activity. The Display APIs continue to provide display area bounds.
How apps can achieve same result as override
Declare activities resizable by either setting the android:resizeableActivity manifest attribute to true or the android.supports_size_changes metadata flag to true .
How to optimize apps
Apps that declare they are fully resizable should never rely upon display size to position UI elements. Migrate your app to up‑to‑date APIs that provide WindowMetrics . If you are using Jetpack Compose, take advantage of the WindowSizeClass API to draw the UI based on how much screen area the app has on the current display. See Use window size classes .
How to disable or opt out of override
No opt-out. Migrate from deprecated APIs.
Property flags to adjust override
No property flags for this override.
adb commands to test override
To apply the override:
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
To remove the override:
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
Note: The commands only temporarily apply or remove the override.
ALWAYS_SANDBOX_DISPLAY_APIS
Forces packages to always have Display API sandboxing applied regardless of windowing mode. The Display APIs always provide the app bounds.
How apps can achieve same result as override
Declare activities nonresizable by either setting the android:resizeableActivity attribute to false or the android.supports_size_changes metadata flag to false .
How to optimize apps
Apps that declare they are fully resizable should never rely on display size to position UI elements. Migrate your app from deprecated APIs to up‑to‑date APIs that provide WindowMetrics . See WindowMetricsCalculator .
How to disable or opt out of override
No opt-out. Migrate from deprecated APIs.
Property flags to adjust override
No property flags for this override.
adb commands to test override
To apply the override:
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
To remove the override:
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Forces packages to sandbox the following View APIs to activity bounds:
How apps can achieve same result as override
Resolve the issue in application code by using APIs that provide the bounds of the app window and offsets relative to the app window rather than the bounds of the device display and offsets relative to the device display.
How to optimize apps
Apps should use View APIs, taking into account the possibility of letterboxing and multi-window mode being applied to the app. See WindowMetricsCalculator .
How to disable or opt out of override
Set property flag PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
To remove the override:
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Disables force rotation. Improves the user experience on some apps.
How apps can achieve same result as override
Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION to false .
How to optimize apps
Do not rely on cached camera sensor orientation or device information. For camera compatibility guidance, see Introducing Camera Viewfinder and Support resizable surfaces in your camera app .
How to disable or opt out of override
Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION to true .
Property flags to adjust override
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
adb commands to test override
To apply the override, which removes force rotation:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
To remove the override, which allows force rotation to happen:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Disables activity refresh after force rotation. Improves the user experience when refresh causes state loss in apps.
How apps can achieve same result as override
Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH to false .
How to optimize apps
See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .
How to disable or opt out of override
Set property flag PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH to true .
Property flags to adjust override
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
adb commands to test override
To apply the override, which removes activity refresh:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
To remove the override, which allows activity refresh:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
Makes the packages it is applied to do activity refresh using an onResume() → onPause() → onResume() cycle rather than onResume() → onStop() → onResume() after camera compatibility force rotation.
How apps can achieve same result as override
Set property flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE to true .
How to optimize apps
See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .
How to disable or opt out of override
Set property flag PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
To remove the override:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Forces camera output to be cropped to the opposite orientation when portrait camera orientation doesn't align with the natural device orientation. Many apps don't handle this situation and display stretched images otherwise.
How apps can achieve same result as override
Set property flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT to true .
How to optimize apps
See OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .
How to disable or opt out of override
Set property flag PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT to false .
Property flags to adjust override
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
adb commands to test override
To apply the override, which applies inner front camera cropping:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
To remove the override, which removes inner front camera cropping:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Prevents apps from opting out of app screen sharing (see Media projection ). Implemented when apps misuse the createConfigForDefaultDisplay() API to force full‑screen capture and jeopardize user privacy by exposing the contents of notifications, which are captured with full‑screen but not app screen sharing, and all apps regardless of windowing mode.
How apps can achieve same result as override
Allow the default media projection behavior (implemented in Android 14, API level 34, with createScreenCaptureIntent() ), which enables users to decide whether to share the full screen or a single app window regardless of windowing mode. Or call createScreenCaptureIntent(MediaProjectionConfig) with a MediaProjectionConfig argument returned from a call to createConfigForUserChoice() .
How to optimize apps
Allow users to select whether to share the entire device display or an app window during media projection, which as of Android 14 is the default behavior.
Make your app resizable ( resizeableActivity="true" ) to support multi‑window mode.
How to disable or opt out of override
Because of the seriousness of user privacy, your app cannot disable or opt out of this override.
Property flags to adjust override
Никто.
adb commands to test override
To apply the override, which cancels the app's opt out of partial screen sharing (that is, enables partial screen sharing):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
To remove the override, which allows the app's opt out of partial screen sharing:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Enables sending fake focus for unfocused apps in split‑screen mode. Some game engines wait to get focus before drawing the content of the app; and so, fake focus helps apps avoid staying blacked out when they are resumed and do not yet have focus.
How apps can achieve same result as override
Set property flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS to true .
How to optimize apps
You can avoid this issue if your app handles multiple orientations and configuration changes well. Make your app large screen ready by following the Large screen app quality guidelines.
If you run the Unity game engine, upgrade to version 2019.4.40 or later and re‑export your game. Keep the Resizable Window option checked in the Android Player settings.
How to disable or opt out of override
Set property flag PROPERTY_COMPAT_ENABLE_FAKE_FOCUS to false .
Property flags to adjust override
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
To remove the override:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Note: The commands only temporarily apply or remove the override.
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
When the override is enabled, the activity receives configuration coupled with caption bar insets. Normally, caption bar insets are decoupled from configuration.
How apps can achieve same result as override
Enable edge‑to‑edge display or update the app's target SDK to API level 35 or higher. See the following:
- Compose: About window insets
- Views: Display content edge-to-edge in views
- Configuration: Behavior changes: Apps targeting Android 15 or higher
How to optimize apps
You can avoid this issue if your app enables edge‑to‑edge display or targets API level 35 or higher.
How to disable or opt out of override
Enable edge‑to‑edge display or target API level 35 or higher.
Property flags to adjust override
Никто.
adb commands to test override
To apply the override:
adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
To remove the override:
adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
Note: The commands only temporarily apply or remove the override.
Дополнительные ресурсы
- Large screen app quality guidelines
- Core app quality guidelines
A virtual device owner is a trusted or privileged app that manages a virtual device. Virtual device owners create virtual devices to render apps and then project the apps to remote devices, such as personal computers, virtual reality devices, or car infotainment systems. The virtual device owner is on a local device, such as a phone. ↩