Android активирует режим совместимости для приложений, которые объявляют ограничения на ориентацию или изменение размера. Режим совместимости обеспечивает приемлемое поведение приложения на устройствах с большим экраном и складных телефонах-раскладушках, но с неоптимальным удобством использования.
Переопределения для каждого приложения позволяют производителям устройств изменять поведение приложений, чтобы улучшить взаимодействие с пользователем или предотвратить сбои приложений на определенных устройствах.
Эталонные устройства
Следующие устройства могут потребовать переопределения для каждого приложения из-за необычных конфигураций или конфигураций, которые плохо поддерживаются приложениями:
- Планшеты. Естественная ориентация некоторых планшетов, например Pixel Tablet, — альбомная. Устройство находится в своей естественной ориентации, когда
Display#getRotation()
возвращаетSurface.ROTATION_0
. Если приложения предполагают, чтоROTATION_0
— книжная ориентация, макеты приложений и предварительный просмотр камеры могут не соответствовать дисплею устройства. - Складные устройства в альбомной ориентации. Некоторые складные устройства, такие как Pixel Fold, в сложенном состоянии имеют портретную ориентацию, а в разложенном — альбомную. Если приложения предполагают, что развернутая ориентация — книжная, вероятны мерцающие петли или проблемы с макетом.
- Складные раскладушки. В развернутом виде раскладушки обычно имеют портретную ориентацию. Но в сложенном состоянии телефоны обычно имеют небольшой дисплей в альбомной ориентации. Приложения должны распознавать и учитывать различные ориентации дисплеев.
Распространенные проблемы совместимости
Приложения чаще всего сталкиваются с проблемами совместимости из-за ограничений ориентации приложения, ограничений на изменение размера и соотношения сторон, неправильной обработки ориентации предварительного просмотра камеры и неправильного использования API.
Леттербоксинг
При использовании формата «леттербокс» приложение размещается в центре экрана, а на больших экранах — в одну или другую сторону для удобного доступа. Подложки (сплошные полосы или размытые обои) заполняют неиспользуемую область отображения по бокам или сверху и снизу приложения.
Леттербоксинг часто встречается на устройствах с большим экраном, поскольку размеры и соотношение сторон дисплея устройства обычно отличаются от размеров стандартных телефонов, для которых разработано большинство приложений.
Проблема
Приложение поддерживает не все конфигурации дисплея, поскольку оно имеет фиксированную ориентацию, фиксированное соотношение сторон или не имеет возможности изменения размера.
Параметры конфигурации, которые управляют ориентацией и изменением размера приложения, включают следующее:
screenOrientation
: определяет фиксированную ориентацию приложения. Приложения также могут устанавливать ориентацию во время выполнения с помощьюActivity#setRequestedOrientation()
.resizeableActivity
: указывает, может ли система изменять размер приложений, чтобы они соответствовали окнам разных размеров. В Android 11 (уровень API 30) и более ранних версиях указывает, поддерживают ли приложения многооконный режим. В Android 12 (уровень API 31) и более поздних версиях указывает, поддерживают ли приложения многооконный режим на маленьких экранах ( класс компактного размера окна ). В Android 12 и более поздних версиях приложения поддерживают многооконный режим на больших экранах (средний или расширенный класс размеров окон) независимо от этого параметра.maxAspectRatio
: указывает максимальное соотношение сторон, поддерживаемое приложением. Только приложения, для которыхresizeableActivity
установлено значениеfalse
могут устанавливатьmaxAspectRatio
.minAspectRatio
: указывает минимальное соотношение сторон, поддерживаемое приложением. Только приложения, для которыхresizeableActivity
установлено значениеfalse
могут устанавливатьminAspectRatio
.
Оптимизация
Приложение должно поддерживать все ориентации и размеры дисплея устройства и многооконного режима . Удалите все ограничения ориентации и фиксированного соотношения сторон из макетов вашего приложения и файла манифеста приложения.
Обходной путь совместимости
Если приложение с фиксированной ориентацией или фиксированным соотношением сторон запускается в окне, где приложение напрямую не поддерживает размер или ориентацию окна, Android помещает приложение в почтовый ящик, чтобы сохранить непрерывность.
Начиная с Android 12 (уровень API 31) и вплоть до версии 12L (уровень API 32), платформа применяет множество улучшений к приложениям почтового ящика. Производители устройств реализуют улучшения пользовательского интерфейса. Чтобы воспользоваться преимуществами улучшений, вам не нужно проводить дополнительную разработку приложения.
В Android 12 (уровень API 31) представлены следующие эстетические улучшения, которые могут быть настроены производителями устройств:
- Закругленные углы: углы окна приложения выглядят более изысканно.
- Прозрачность системной панели: панели состояния и навигации, накладывающиеся на приложение, являются полупрозрачными, благодаря чему значки на панелях всегда видны на фоне почтового ящика.
- Настраиваемое соотношение сторон: соотношение сторон приложения можно настроить, чтобы улучшить его внешний вид.
12L (уровень API 32) добавляет следующие функциональные улучшения:
Настраиваемое расположение. На больших экранах производители устройств могут расположить приложение слева или справа от дисплея, что упрощает взаимодействие.
Обновленная кнопка перезапуска. Производители устройств могут придать кнопке перезапуска режима совместимости размеров новый вид для лучшего распознавания пользователями.
В Android 13 (уровень API 33) добавлено диалоговое окно обучения пользователей о размещении приложения с почтовым ящиком на экране или включении почтового ящика в режиме разделенного экрана:
Режим совместимости размеров
Режим совместимости размеров — это почтовый ящик, включающий элемент управления перезапуском. Этот элемент управления позволяет пользователям перезапускать приложение и перерисовывать экран. Android активирует режим совместимости размеров для приложений, размер которых не подлежит изменению. Когда действие перемещается в контейнер отображения, несовместимый с размерами действия, система может изменить масштаб приложения, чтобы заполнить дисплей устройства хотя бы в одном измерении.
Изменения конфигурации устройства, которые могут активировать режим совместимости размеров, включают следующее:
- Поворот устройства
- Складное устройство складывается или раскладывается
- Переключение между полноэкранным режимом и режимом разделенного экрана.
Проблема
Режим совместимости размеров обычно применяется к действиям, которые ограничены по ориентации или соотношению сторон и настроены (или определены системой) как неизменяемые.
Ваше приложение считается допускающим изменение размера и не будет переведено в режим совместимости размеров, если оно соответствует любому из следующих критериев:
- Изменяется размер с помощью
resizeableActivity="true"
- Поддерживает режим «картинка в картинке» (PIP).
- Встроен
- Имеет ли переопределение
FORCE_RESIZE_APP
для каждого приложения, примененное производителем устройства (свойства, установленные приложением, игнорируются)
Если ваше приложение не соответствует ни одному из условий, оно считается недоступным для изменения размера и может быть переведено в режим совместимости размеров.
Оптимизация
Приложение должно поддерживать все размеры дисплея. Сделайте свое приложение изменяемым, установив для атрибута android:resizeableActivity
элемента <activity>
или <application>
значение true
в манифесте приложения. Создавайте адаптивные макеты для вашего приложения. Дополнительные сведения см. в разделах «Поддержка различных размеров экрана» и «Поддержка многооконного режима» .
Обходной путь совместимости
Android переводит приложение в режим совместимости размеров, когда система определяет, что отображение приложения в почтовом ящике можно улучшить, изменив масштаб приложения, чтобы заполнить окно отображения хотя бы в одном измерении. Система отображает элемент управления перезапуском, который воссоздает процесс приложения, воссоздает действие и перерисовывает отображение. См. также Обзор процессов и потоков .
Мерцающие петли
Если приложение не поддерживает все ориентации экрана, оно может неоднократно запрашивать новые ориентации при изменении конфигурации, создавая бесконечный цикл, из-за которого дисплей мерцает или приложение бесконечно вращается.
Проблема
В 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 также обрезает изображение датчика камеры, если ориентация датчика — альбомная, а предварительный просмотр камеры — книжная. Конкретные обходные пути включают следующее:
Принудительно повернуть предварительный просмотр камеры для приложений с портретной ориентацией. Приложения, ограниченные портретной ориентацией, ожидают, что естественная ориентация устройства и ориентация датчика камеры будут портретной. Однако в Android 12 (уровень API 31) и более поздних версиях приложения могут работать в нескольких ориентациях устройства, если производители устройств игнорируют спецификацию ориентации.
Когда к камере подключено приложение с ограничениями портретной ориентации, Android Force поворачивает приложение, чтобы выровнять портретное окно приложения с естественной ориентацией устройства.
На некоторых планшетах (см. эталонные устройства ) портретное окно приложения повернуто в полноэкранный портрет, чтобы соответствовать естественной ориентации устройства. Приложение занимает весь экран после принудительного поворота.
На внутреннем экране складных устройств с альбомной ориентацией (см. справочные устройства ) действия, отображаемые только в книжной ориентации, поворачиваются в альбомную ориентацию, чтобы соответствовать развернутой естественной ориентации. Приложение закрывается после принудительного вращения.
Обрезка внутренней передней камеры. Датчик внутренней передней камеры на некоторых складных устройствах имеет альбомную ориентацию. В дополнение к принудительному повороту предварительного просмотра камеры на складном внутреннем дисплее Android обрезает поле зрения внутренней передней (альбомной) камеры так, чтобы датчик захватывал изображение, противоположное ориентации устройства.
Принудительное обновление предварительного просмотра камеры: система циклически использует методы активности
onStop()
иonStart()
(по умолчанию) илиonPause()
иonResume()
(применяются переопределением OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE для каждого приложения) после принудительного поворота, чтобы убедиться, что предварительный просмотр камеры отображается правильно.Масштабирование соотношения сторон: система динамически изменяет соотношение сторон предварительного просмотра камеры, повернутой с помощью силы, на более высокое минимальное соотношение сторон, что обеспечивает правильное масштабирование предварительного просмотра камеры.
Разработчики приложений могут обойти эти обходные пути, если приложения правильно обрабатывают предварительный просмотр камеры. См. Переопределения для каждого приложения .
API-интерфейсы, которые часто используются неправильно
Поскольку в Android добавлена поддержка таких функций, как многооконный режим и складные устройства, устаревшие API устарели и заменены современными 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
, могут включать стили, которые делают действия прозрачными.
Прозрачные действия не охватывают все доступное пространство дисплея, что затрудняет управление ими, поскольку доступная область отображения может меняться в зависимости от изменений конфигурации, таких как вращение устройства, сворачивание и раскладывание устройства, а также многооконный режим.
Проблема
Прозрачное действие должно соответствовать границам первого непрозрачного действия ниже прозрачного действия в стеке действий задачи. Однако непрозрачное действие, запускающее диалоговое окно разрешений, может быть батутом (действие, которое запускает другое действие, затем исчезает); и поэтому система не может определить границы действия батута, которое запустило действие прозрачного диалогового окна разрешений.
Оптимизация
Прозрачные действия наследуют свои ограничения от самого верхнего непрозрачного действия под ним в стеке действий задачи. Непрозрачное действие должно быть доступно на протяжении всего жизненного цикла прозрачного действия, от создания действия до уничтожения. По этой причине не запускайте запросы разрешений от занятий прыжками на батуте.
Если действие батута запускает запрос разрешения, пользователь может не увидеть диалоговое окно разрешения, поскольку действие батута будет уничтожено до того, как пользователь сможет ответить на диалоговое окно, а также размеры и положение диалогового действия. возможно, было рассчитано неправильно.
Приложения всегда должны запускать запросы разрешений от действий, которые остаются видимыми до тех пор, пока пользователь не примет решение о разрешении.
Закругленные углы
Действие может быть прозрачным из-за стиля, определяющего прозрачность фона, или из-за того, что содержимое действия не заполняет доступное пространство отображения. Если прозрачное действие заполняет доступное пространство дисплея, система автоматически применяет к этому действию закругленные углы, если это настроено производителем устройства. Но если прозрачное действие (например, диалоговое окно разрешений) не заполняет доступное пространство, вам решать, применять ли закругленные углы.
Диалоговые окна разрешений не заполняют доступное пространство отображения, поскольку макет диалога обычно использует LayoutParams.WRAP_CONTENT, а не LayoutParams.MATCH_PARENT .
Обходной путь совместимости
Сохраняйте действия, запускающие диалоговые действия, видимыми до тех пор, пока пользователь не ответит на диалог.
Система гарантирует, что прозрачное действие наследует все ограничения от первого непрозрачного действия, расположенного ниже прозрачного действия в стеке действий, включая ограничения, связанные с:
- Режим совместимости размеров
- Ориентация
- Соотношение сторон
Unity-игры
Игры Unity работают на Android в полноэкранном или многооконном режиме. Однако многие игры Unity теряют фокус и перестают отображать контент, когда приложение переводится в многооконный режим.
Проблема
Unity добавила опцию Resizable Window
в Unity 2019.4 для поддержки многооконного режима на Android. Однако первоначальная реализация не реагировала правильно на жизненный цикл активности в многооконном режиме , в результате чего UnityPlayer приостанавливал воспроизведение, когда приложение теряло фокус. Игрок отображал черный экран или последний замороженный кадр игры. Геймплей возобновлялся только тогда, когда пользователь касался экрана. Многие приложения, использующие движок Unity, сталкиваются с этой проблемой и отображаются в виде черного окна в многооконном режиме.
Оптимизация
Обновите Unity до версии 2019.4.40 или более поздней и повторно экспортируйте свою игру. Оставьте флажок Resizable Window
в настройках Android Player , иначе игра приостанавливается, когда она не в фокусе, даже если игра полностью видна в многооконном режиме.
Обходной путь совместимости
Производители устройств могут применить переопределение OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
для каждого приложения, чтобы обеспечить ложное событие фокуса для приложения в многооконном режиме. Переопределение позволяет действию перерисовывать содержимое и не затемняться.
Проверьте свое приложение на наличие проблем совместимости.
Чтобы протестировать свое приложение и понять, как оно ведет себя в разных форм-факторах, воспользуйтесь следующими ресурсами:
- Потоковая передача с устройств. Чтобы протестировать свое приложение на рабочих устройствах (включая эталонные устройства ), размещенных в центрах обработки данных Google, см. раздел «Потоковая передача с устройств Android на базе Firebase».
- Эмуляторы в Android Studio Hedgehog: информацию о создании эмуляторов для эталонных устройств см. в разделе Создание виртуальных устройств и управление ими.
- Эмулятор Android Studio с изменяемым размером: информацию о доступе к виртуальным устройствам см. в разделе «Запуск приложений на эмуляторе Android».
В почтовом ящике
Убедитесь, что каждое действие может использовать все пространство дисплея, доступное приложению. Сначала объявите следующий код в тестовой папке:
Котлин
fun Activity.isLetterboxed() : 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(Activity 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 { assertThat(it.isLetterboxed()).isFalse() } }
Ява
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { assertThat(isLetterboxed(activity)).isFalse(); }); } }
В идеале запускайте такой тест только до тех пор, пока он не пройдет успешно и не подтвердит, что действия вашего приложения занимают все доступное приложению пространство дисплея. Протестируйте свое приложение на всех типах устройств, чтобы обеспечить единообразное поведение.
Переопределения для каждого приложения
Android предоставляет переопределения, которые меняют настроенное поведение приложений. Например, переопределение FORCE_RESIZE_APP
предписывает системе обойти режим совместимости размеров и изменить размер приложения в соответствии с размерами дисплея, даже если в манифесте приложения указано resizeableActivity="false"
.
Производители устройств применяют переопределения для выбора приложений (или всех приложений) на определенных устройствах с большим экраном. В Android 14 (уровень API 34) и более поздних версиях пользователи могут применять переопределения к приложениям через настройки устройства.
Переопределения для каждого приложения для пользователя
В 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
не имеет никакого эффекта.
Оптимизируйте свое приложение для всех экранов. Не устанавливайте ограничения на соотношение сторон в своем приложении. Используйте классы размеров окон для поддержки различных макетов в зависимости от объема доступного места для отображения.
Переопределения производителя устройства для каждого приложения
Производители устройств применяют переопределения для каждого приложения на отдельных устройствах. Эталонные устройства могут по умолчанию применять некоторые переопределения к различным приложениям.
Приложения могут отказаться от большинства переопределений (см. таблицу переопределений для отдельных приложений ниже).
Вы можете протестировать свое приложение с включенными или отключенными переопределениями с помощью платформы совместимости (см. Инструменты платформы совместимости ). Если этот параметр включен, переопределения применяются ко всему приложению.
Вы также можете использовать 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 | Переопределение гейткипера, которое необходимо включить для применения любых других переопределений соотношения сторон. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Если этот параметр включен (по умолчанию), область переопределения ограничивается действиями только в портретной ориентации. | |
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_REFRESH | 264304459 | Удаляет жесткое обновление по умолчанию, применяемое при принудительном повороте предварительного просмотра камеры. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Переключает жесткое обновление на мягкое при принудительном повороте предварительного просмотра камеры, что помогает сохранить состояние во время принудительного поворота. По умолчанию Android применяет принудительное обновление при принудительном повороте предварительного просмотра камеры. Принудительное обновление может вызвать проблемы с потерей состояния приложений или их отключением в зависимости от того, как приложения кэшировали свое предыдущее состояние. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Обрезает буфер изображения внутренней фронтальной камеры. Если переопределение отключено, внутреннее кадрирование передней камеры удаляется, а поле предварительного просмотра камеры увеличивается. По умолчанию на некоторых складных устройствах (см. эталонные устройства ) система обрезает предварительный просмотр всех приложений камеры при использовании внутренней передней камеры. | |
Разнообразный | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Предотвращает затемнение приложения, когда оно теряет фокус в режиме разделенного экрана. Приложение ожидает фокусировки, прежде чем рисовать содержимое приложения, что может привести к зависанию приложения или его затемнению. Переопределение позволяет Android отправлять приложению ложное событие фокуса, которое сигнализирует приложению о необходимости снова начать отрисовку контента. |
FORCE_RESIZE_APP
Принудительно изменяет размер пакетов, к которым применяется переопределение. Не изменяет возможность перевода приложения в многооконный режим, но позволяет приложению изменять размер без перехода в режим совместимости размеров при изменении размера экрана.
Как приложения могут достичь того же результата, что и переопределение
В манифесте приложения либо установите для атрибута android:resizeableActivity
значение true
, либо, чтобы поддерживать изменение размера при отключении многооконного режима с помощью android:resizeableActivity=false
, установите для флага метаданных android.supports_size_changes
значение 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
Flag для false
в манифесте приложения и объявьте ограничение ориентации или отношения сторон.
Как оптимизировать приложения
Все приложения, которые ведут себя хорошо, в случае изменения размера, должны иметь android:resizeableActivity
или android.supports_size_changes
устанавливаться на true
. Другие приложения должны быть улучшены, чтобы вести себя хорошо при изменении размера. См. 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
на уровне активности или приложения.
Как оптимизировать приложения
Не устанавливайте ограничения соотношения сторон в вашем приложении. Убедитесь, что ваше приложение поддерживает разные размеры дисплея . Используйте классы размера окна для поддержки различных макетов в зависимости от количества места, которое ваше приложение имеет на экране. Смотрите API Compose WindowSizeClass
и просмотрите API WindowSizeClass
.
Как отключить или отказаться от переопределения
Укажите ограничение соотношения сторон или установите свойства свойства свойства 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 .
Как отключить или отказаться от переопределения
См. 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_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
Позволяет следующим переопределениям переопределить любую ориентацию:
- Override_undefined_orientation_to_portrait
- Override_undefined_orientation_to_nosensor
- Override_landscape_orientation_to_reverse_landscape
Как приложения могут достичь того же результата, что и переопределение
Установите 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()
.
Как приложения могут достичь того же результата, что и переопределение
Не устанавливайте атрибут
android:screenOrientation
Manifest или установите атрибут"user"
.Установите
android:resizeableActivity
Manifest Attribute кtrue
.На небольших экранах, чтобы поддержать изменение размера приложения при отключении режима с несколькими ветрами с помощью
android:resizeableActivity=false
, установите флаг метаданногоandroid.supports_size_changes
дляtrue
. Не устанавливайтеminAspectRatio
иmaxAspectRatio
.
Как оптимизировать приложения
Позвольте своему приложению поддержать все ориентации; Не устанавливайте спецификацию screenOrientation
в манифесте вашего приложения. Поддержка App Resizebility, режим мульти -ветра и все отношения отображает атрибуты сторон, установив атрибут 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
Позволяет ориентации на носенсор для всех действий в пакете. Если не включена 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
Ограничивает ориентацию отображения на ландшафтную естественную ориентацию, когда выполняются следующие условия:
- Активность - полный экран
- Отказ от свойства компонента
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
Полагает политику Compat, которая пропускает обновление ориентации приложений в ответ на App Calling Activity#setRequestedOrientation()
когда приложение перезапускается или имеет активную обработку CAMERA Compat.
Как приложения могут достичь того же результата, что и переопределение
Установите свойство свойства свойства 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
Включает политику совместимости, которая игнорирует запрошенную приложение ориентацию в ответ на приложение Calling 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_request_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
Пакеты сил, чтобы никогда не Display
песочницу API, применяемые для активности в режиме совместимости в письме или размере. API -интерфейсы Display
продолжают предоставлять границы областей отображения.
Как приложения могут достичь того же результата, что и переопределение
Объявить действий, решаемые, либо установив атрибут android:resizeableActivity
Manifest для true
или android.supports_size_changes
Flag Метаданные метаданные к 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
Пакеты сил, которые всегда имеют Display
API, применяются независимо от режима окон. API -интерфейсы Display
всегда предоставляют границы приложения.
Как приложения могут достичь того же результата, что и переопределение
Объявите действий, не соответствующими, либо установив атрибут android:resizeableActivity
для false
или android.supports_size_changes
Metadata Flag до false
.
Как оптимизировать приложения
Приложения, которые заявляют, что они полностью решаются, никогда не должны полагаться на размер дисплея, чтобы позиционировать элементы пользовательского интерфейса. Перенесите свое приложение из устаревших API в 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
Пакеты сил в песочнице Следующий View
API -интерфейсов к границам активности:
Как приложения могут достичь того же результата, что и переопределение
Решите проблему в коде приложения, используя API, которые предоставляют границы окна приложения и смещения относительно окна приложения, а не границ отображения устройства и смещений относительно дисплея устройства.
Как оптимизировать приложения
Приложения должны использовать API View
, принимая во внимание возможность применения буквы и режима мульти-Window. Смотрите 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_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_proction_single_app_option
Предотвращает отказа от обмена экранами приложений (см. Проекцию медиа ). Реализовано, когда приложения неправильно используют API createConfigForDefaultDisplay()
чтобы заставить полноэкранного захвата и поставить под угрозу конфиденциальность пользователей, обнажая содержимое уведомлений, которые фиксируются с полным экраном, но не обмен экраном приложений, и все приложения независимо от режима окна.
Как приложения могут достичь того же результата, что и переопределение
Разрешить поведение проекции медиа по умолчанию (реализовано в Android 14, API -уровне 34, с createScreenCaptureIntent()
), что позволяет пользователям решать, делиться ли полноэкранным или одним окном приложения независимо от режима окон. Или Call createScreenCaptureIntent(MediaProjectionConfig)
с аргументом MediaProjectionConfig
возвращенным от вызова createConfigForUserChoice()
.
Как оптимизировать приложения
Позвольте пользователям выбирать, обмениваться ли весь дисплей устройства или окно приложения во время проекции носителя, которое, по состоянию на Android 14, является поведением по умолчанию.
Сделайте свой приложение Resizeable ( 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 Game, обновите до версии 2019.4.40 или более поздней версии и повторно объясните свою игру. Держите параметр Resizable Window
установленной в настройках Android Player .
Как отключить или отказаться от переопределения
false
свойство свойства PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
.
Флаги свойств для настройки переопределения
<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>
Примечание. Команды только временно применяют или удалили переопределение.
Дополнительные ресурсы
,Android активирует режим совместимости для приложений, которые объявляют ограничения на ориентацию или переселение. Режим совместимости обеспечивает приемлемое поведение приложений на больших экране и складываемых флип -телефонах, но с неоптимальным удобством использования.
Переопределение приложений позволяет производителям устройств изменить поведение приложений, чтобы улучшить пользовательский опыт или предотвратить разрыв приложений на определенных устройствах.
Справочные устройства
Следующие устройства могут потребовать переопределения приложения из-за необычных конфигураций или конфигураций, которые не очень хорошо поддерживаются приложениями:
- Таблетки: естественная ориентация некоторых таблеток, таких как пиксельные таблетки, является ландшафтом. Устройство находится в своей естественной ориентации, когда
Display#getRotation()
возвращаетSurface.ROTATION_0
. Если приложения предполагают,ROTATION_0
является портретным, макеты приложений и предварительный просмотр камеры могут быть несоответствующие на дисплее устройства. - Складные ландшафты: некоторые складные устройства, такие как Pixel Fold, находятся в ориентации на портрету при складывании, но ориентация на ландшафт при развертывании. Если приложения предполагают, что развернутая ориентация является портретной, вероятными петлями или проблемами макета.
- Складные флип -телефоны: развернутые флип -телефоны обычно находятся в портретной ориентации. Но при складывании телефоны обычно имеют небольшой дисплей в ландшафтной ориентации. Приложения должны идентифицировать и приспособить различные ориентации дисплеев.
Общие проблемы совместимости
Приложения испытывают проблемы совместимости чаще всего из -за ограничений ориентации приложений, ограничений с рецепцией и соотношения сторон, неправильной обработки ориентации предварительного просмотра камеры и неправильных API.
Почтовая коробка
Lettersing позиционирует приложение в центре экрана или, на больших экранах, с одной или другой стороны для удобного доступа. Mattes (сплошные стержни или размытые обои) заполняют неиспользованную область отображения вдоль боков или верхней и нижней части приложения.
Письмо, часто встречается на больших экране, потому что размеры и соотношение сторон отображения устройства обычно отличаются от размеров стандартных телефонов, для которых разработано большинство приложений.
Проблема
Приложение не поддерживает все конфигурации отображения, потому что приложение имеет фиксированную ориентацию, фиксированное соотношение сторон или не изменяется.
Настройки конфигурации, которые контролируют ориентацию и повторную оценку приложения, включают следующее:
screenOrientation
: указывает фиксированную ориентацию для приложения. Приложения также могут устанавливать ориентацию во время выполнения, используяActivity#setRequestedOrientation()
.resizeableActivity
: указывает, может ли система изменить размер приложений для соответствия окнам различных измерений. На Android 11 (API -уровне 30) и ниже, указывают, поддерживают ли приложения режим мульти -ветра. На Android 12 (API -уровне 31) и выше, указывают, поддерживают ли приложения режим мульти -ветра на небольших экранах ( класс компактных размеров окна ). На Android 12 и выше приложения поддерживают многопрофильный режим на больших экранах (средний или расширенный класс размера окна) независимо от этой настройки.maxAspectRatio
: указывает максимальное соотношение сторон, поддерживаемое приложением. Только приложения сresizeableActivity
установленные наfalse
могут установитьmaxAspectRatio
.minAspectRatio
: указывает минимальное соотношение сторон, поддерживаемое приложением. Только приложения сresizeableActivity
установленные наfalse
могут установитьminAspectRatio
.
Оптимизация
Приложение должно поддерживать все ориентации и размеры режима и режима с несколькими Window . Удалите все ограничения ориентации и фиксированного соотношения сторон из макетов вашего приложения и файла Manifest App.
Совместимость обходной путь
Если приложение с фиксированной ориентацией или фиксированным соотношением сторон работает в окне, где приложение напрямую не поддерживает размер или ориентацию окна, Android Letterboxes App для сохранения непрерывности.
Начиная с Android 12 (API -уровне 31) и продолжая с 12L (уровень API 32), платформа применяет множество усовершенствований к приложениям для букв. Производители устройств реализуют улучшения пользовательского интерфейса. Вам не нужно делать дополнительную разработку для вашего приложения, чтобы извлечь выгоду из улучшений.
Android 12 (API -уровень 31) представляет следующие эстетические улучшения, которые могут быть настроены производителями устройств:
- Округлые углы: Уголки окна приложения имеют более изысканный вид.
- Прозрачность системной панели: статус и навигационные полосы, которые накладывают приложение, являются полупрозрачными, что делает значки на стержнях, которые всегда можно просмотреть на фоне письма.
- Настраиваемое соотношение сторон: соотношение сторон приложения можно скорректировать для улучшения внешнего вида приложения.
12L (уровень API 32) добавляет следующие функциональные улучшения:
Настраиваемое позиционирование: на больших экранах производители устройств могут расположить приложение слева или правой стороне дисплея, что облегчает взаимодействие.
Перезагрузка перезапуска: производители устройств могут дать кнопку перезагрузки для режима совместимости по размеру новый образ для лучшего распознавания пользователями.
Android 13 (API -уровень 33) добавляет диалог по обучению пользователей о позиционировании приложения для букв на экране или включает в себя буквы в режиме разделенного экрана:
Режим совместимости размера
Режим совместимости размера - это буквы, которое включает в себя управление перезагрузкой. Управление позволяет пользователям перезагрузить приложение и перерисовать дисплей. Android вызывает режим совместимости размера для приложений, которые определяются как нерезидентные. Когда деятельность перемещается в контейнер отображения, который несовместимо с размерами деятельности, система может спасти приложение для заполнения дисплея устройства как минимум в одном измерении.
Изменения конфигурации устройства, которые могут запустить режим совместимости размера, включают следующее:
- Вращение устройства
- Складное складное устройство или развертывание
- Изменение между полноэкранными режимами отображения и разделенного экрана
Проблема
Режим совместимости размера обычно применяется к действиям, которые ограничены в ориентации или соотношении сторон и настроены (или определяются системой), чтобы не решать.
Ваше приложение считается измененным, и не будет помещено в режим совместимости размера - если оно соответствует любому из следующих критериев:
- Помещается с помощью
resizeableActivity="true"
- Поддерживает режим изображения в картине (PIP)
- Встроен
- Игнорируется переоборудовано переоборудование
FORCE_RESIZE_APP
PER APP (свойства, установленные приложением, игнорируются)
Если ваше приложение не соответствует ни одному из условий, оно считается не изменяемым и может быть размещено в режиме совместимости размера.
Оптимизация
Приложение должно поддерживать все размеры отображения. Сделайте ваше приложение, соответствующее использованию атрибута android:resizeableActivity
элемента <activity>
или <application>
в true
в манифесте приложения. Проектирование отзывчивых/адаптивных макетов для вашего приложения. Для получения дополнительной информации см. Поддержку различных размеров отображения и поддержка режима многонародного режима .
Совместимость обходной путь
Android помещает приложение в режиме совместимости размера, когда система определяет отображение приложения в буквах, можно улучшить путем пересечения приложения, чтобы заполнить окно отображения как минимум в одном измерении. Система отображает контроль перезапуска, который воссоздает процесс приложения, воссоздавая деятельность и перерисовывает дисплей. См. Также Обзор процессов и потоков .
Мерцающие петли
Когда приложение не поддерживает все ориентации отображения, оно может многократно запрашивать новые ориентации, когда происходит изменение конфигурации, создавая бесконечный цикл, который заставляет дисплей мерцание или приложение вращаться бесконечно.
Проблема
На Android 12 (API -уровне 31) и выше производители устройств могут настроить свои устройства, чтобы игнорировать ограничения ориентации, указанные приложениями, и вместо этого обеспечивать соблюдение режимов совместимости. Например, складываемое устройство может игнорировать настройку android:screenOrientation="portrait"
, когда активность отображается на внутреннем экране размером с ландшафта устройства.
Если ограничения на ориентацию приложения игнорируются, приложение может программно устанавливать свою ориентацию, вызывая Activity#setRequestedOrientation()
. Вызов вызывает перезапуск приложения, если приложение не обрабатывает изменения конфигурации (см. Изменения конфигурации ручки ). После перезапуска ограничения на ориентацию приложения снова игнорируются, приложение повторяет призыв к setRequestedOrientation()
, вызов вызывает перезапуск приложения и т. Д. В самосовершенной петле.
Другим способом вы можете столкнуться с этим, когда естественной ориентацией ( обычная ориентация, определяемая Android) экрана устройства, является ландшафт (то есть вызов Display#getRotation()
возвращает Surface.ROTATION_0
, в то время как устройство имеет соотношение ландшафта). Исторически, приложения предполагали, что Display.getRotation() = Surface.ROTATION_0
означает, что устройство находится в ориентации портрета, но это не всегда так, например, на внутреннем экране некоторых складных устройств и на некоторых планшетах.
An app in landscape orientation on a foldable inner display, might check the screen rotation, receive a value of ROTATION_0
, assume the natural orientation of the device is portrait, and call setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
to reconfigure the app layout. After the app restarts (in landscape orientation), it might again check the screen rotation, receive a value of ROTATION_0
, call setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
, and continue the infinite loop.
Оптимизация
Apps should not do the following:
- Set a default orientation with
Activity#setRequestedOrientation()
in the activityonCreate()
method because the orientation request can be triggered unexpectedly by unhandled configuration changes - Assume the natural orientation of the device (
ROTATION_0
) is portrait - Set orientation based on signals not related to the current window size such as
Display#getRotation()
, presence of aFoldingFeature
, or deprecated APIs .
Compatibility workaround
Android ignores calls to Activity#setRequestedOrientation()
in the following situations:
The activity has already relaunched from a previous call to the method or the camera compat force rotation treatment has been enabled (see Camera preview below).
Device manufacturers can apply this behavior to an app with
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.The activity made more than two orientation requests in one second, which indicates a loop has occurred. Of the two requests in the loop, Android uses the one that maximizes the app display area.
Device manufacturers can apply this behavior to an app with
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.
Camera preview
The camera preview (or viewfinder) of camera apps can be misaligned or distorted on tablets, laptops, and foldable displays.
Проблема
The Android Compatibility Definition Document states that a camera image sensor "MUST be oriented so that the long dimension of the camera aligns with the screen's long dimension."
Apps often assume that device orientation and camera sensor orientation are portrait—a reasonable assumption on standard mobile phones. But the natural orientation of tablets and laptops and their camera sensors can be landscape. Also, new form factors like foldables can have multiple natural orientations and multiple camera sensors in varying orientations.
Starting an activity with a camera orientation the app does not expect or switching between different cameras or device screens (for foldables) can cause a misaligned or distorted camera preview.
Оптимизация
Camera apps must correctly identify and manage device orientation and camera sensor orientation to present a correctly aligned and scaled camera preview. Apps must calculate device rotation, sensor rotation, and screen or window aspect ratio, and then apply the results to the camera preview. For detailed guidance, see Camera preview and Introducing Camera Viewfinder .
Compatibility workaround
A device is in natural orientation when Display#getRotation()
returns Surface.ROTATION_0
. The system calculates CameraCharacteristics.SENSOR_ORIENTATION
from the device's natural orientation. Android aligns the portrait window of portrait‑restricted apps with the natural orientation of the device, which is what most apps expect. Android also crops the camera sensor image when the sensor orientation is landscape and the camera preview is portrait. The specific workarounds include the following:
Force rotate camera previews for portrait-restricted apps: Apps restricted to portrait orientation expect the device's natural orientation and the camera sensor orientation to be portrait. However, on Android 12 (API level 31) and higher, apps can run in multiple device orientations if device manufacturers ignore the orientation specification.
When a portrait-restricted app is connected to the camera, Android force rotates the app to align the app portrait window with the natural orientation of the device.
On some tablets (see reference devices ), the app portrait window is rotated to full screen portrait to align with the device's natural orientation. The app occupies the full screen after force rotation.
On the landscape inner screen of foldables (see reference devices ), portrait-only activities are rotated to landscape to align with the unfolded natural orientation. The app is letterboxed after force rotation.
Inner front camera cropping: The inner front camera sensor on some foldables is in landscape orientation. In addition to force rotating the camera preview on the foldable inner display, Android crops the inner front (landscape) camera field of view so that the sensor captures a view opposite the device orientation.
Force refresh camera previews: The system cycles through activity methods
onStop()
andonStart()
(by default) oronPause()
andonResume()
(applied by the OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE per-app override) after force rotation to make sure the camera preview is properly displayed.Aspect ratio scaling: The system dynamically changes the aspect ratio of the force rotated camera preview to a higher minimum aspect ratio, which ensures the camera preview is properly scaled.
App developers can override these workarounds if the apps handle camera preview correctly. See Per-app overrides .
Commonly misused APIs
As Android has added support for features like multi‑window mode and devices like foldables, legacy APIs have been deprecated and replaced by up‑to‑date APIs that work for all display sizes and device form factors. However, the deprecated APIs are still available for backward compatibility.
Some View
APIs are designed for special purposes that are not always well understood by developers.
Проблема
Developers continue to use deprecated Display
APIs and incorrectly assume the APIs return the app bounds instead of device display area bounds. Or developers mistakenly use special‑purpose view APIs to get general display metrics. The result is miscalculations when repositioning UI elements after app window resizing events, causing layout issues.
Deprecated and commonly misused Display APIs:
For more information, see Support multi-window mode .
Misused view APIs:
Оптимизация
Never rely on physical display size for positioning UI elements. Migrate your app to APIs based on WindowMetrics
, including the following WindowManager
APIs:
Платформа:
Jetpack:
Compatibility workaround
Two overrides adjust the deprecated Display
APIs and misused View
APIs to return the app bounds: ALWAYS_SANDBOX_DISPLAY_APIS
for Display
APIs; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
for View
APIs. ALWAYS_SANDBOX_DISPLAY_APIS
is also applied by default to apps that qualify for size compatibility mode.
Transparent activities
Transparent activities are the result of transparent background styles, for example:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Themes related to dialogs, such as Theme.MaterialComponents.Dialog
, can include styles that make activities transparent.
Transparent activities don't cover all the available display space, which makes them difficult to manage because the available display area can change based on configuration changes like device rotation, device folding and unfolding, and multi‑window mode.
Проблема
A transparent activity should conform to the bounds of the first opaque activity below the transparent activity in the task activity stack. However, an opaque activity that launches a permission dialog can be a trampoline (an activity that launches another activity then disappears); and so, the system can't determine the bounds of the trampoline activity that launched the transparent permission dialog activity.
Оптимизация
Transparent activities inherit their constraints from the top-most opaque activity beneath them in a task's activity stack. The opaque activity must be available for the entire lifecycle of the transparent activity, from activity creation to destruction. For this reason, don't launch permission requests from trampoline activities.
If a trampoline activity launches a permission request, the user might not be able to see the permission dialog because the trampoline activity will have been destroyed before the user has had a chance to respond to the dialog, and the dimensions and position of the dialog activity might have been calculated incorrectly.
Apps should always launch permission requests from activities that remain visible until the user has made a permission decision.
Rounded corners
An activity can be transparent because of a style that specifies background transparency or because the contents of the activity don't fill the available display space. If a transparent activity fills the available display space, the system automatically applies rounded corners to the activity when configured to do so by the device manufacturer. But, if a transparent activity (like a permission dialog) doesn't fill the available space, it's up to you to decide whether or not to apply rounded corners.
Permission dialogs don't fill the available display space because the dialog layout typically uses LayoutParams.WRAP_CONTENT rather than LayoutParams.MATCH_PARENT .
Compatibility workaround
Keep activities that launch dialog activities visible until the user has responded to the dialog.
The system ensures that a transparent activity inherits all constraints from the first opaque activity beneath the transparent activity in the activity stack, including constraints related to:
- Size compatibility mode
- Ориентация
- Соотношение сторон
Unity games
Unity games run on Android full screen or in multi‑window mode. However, many Unity games lose focus and stop drawing content when the app is placed in multi‑window mode.
Проблема
Unity added a Resizable Window
option in Unity 2019.4 to support multi‑window mode on Android. However, the initial implementation did not react to the activity lifecycle in multi-window mode correctly, causing UnityPlayer to suspend playback when the app loses focus. The player rendered a black screen or the last, frozen frame of the game. Gameplay resumed only when the user tapped the screen. Many apps using the Unity engine face this issue and render as a black window in multi‑window mode.
Оптимизация
Upgrade Unity to 2019.4.40 or later and re‑export your game. Keep the Resizable Window
option checked in the Android Player settings , otherwise the game pauses when not in focus even though the game is entirely visible in multi‑window mode.
Compatibility workaround
Device manufacturers can apply the OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
per‑app override to provide a fake focus event to an app in multi‑window mode. The override enables the activity to redraw content and not be blacked out.
Test your app for compatibility issues
To test your app and understand how it behaves on different form factors, take advantage of the following resources:
- Device streaming: To test your app on production devices (including reference devices ) hosted in Google data centers, see Android Device Streaming, powered by Firebase
- Emulators in Android Studio Hedgehog: For information on creating emulators for reference devices, see Create and manage virtual devices
- Android Studio resizable emulator: For information on accessing virtual devices, see Run apps on the Android Emulator
Is letterboxed
Verify that each activity can use all of the display space available to the app. First, declare the following code in your test folder:
Kotlin
fun Activity.isLetterboxed() : 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(Activity 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(); }
Then run a test to assert the behavior and make sure the target activity is not letterboxed:
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertThat(it.isLetterboxed()).isFalse() } }
Ява
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { assertThat(isLetterboxed(activity)).isFalse(); }); } }
Ideally, run this kind of test only until it passes and asserts that your app's activities take up the entire display space available to the app. Test your app on all device types to ensure consistent behavior.
Per-app overrides
Android provides overrides that change the configured behavior of apps. For example, the FORCE_RESIZE_APP
override instructs the system to bypass size compatibility mode and resize the app to fit display dimensions even if resizeableActivity="false"
is specified in the app manifest.
Device manufacturers apply overrides to select apps—or all apps—on specific large screen devices. On Android 14 (API level 34) and higher, users can apply overrides to apps through device settings.
User per-app overrides
On Android 14 and higher, a settings menu enables users to change the aspect ratio of apps. Large screen devices such as the reference devices implement the menu.
The menu contains a list of all apps installed on the device. Users choose an app and then set the app aspect ratio to 3:4, 1:1, full screen, or other value configured by the device manufacturer. Users can also reset the aspect ratio to the app default, which is specified in the app manifest.
Apps can opt out of the compatibility override by setting the following PackageManager.Property
tags:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
To opt out of the user aspect ratio compatibility override, add the property to your app manifest and set the value to
false
:<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Your app will be excluded from the list of apps in device settings. Users won't be able to override the app's aspect ratio.
Setting the property to
true
has no effect.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
To opt out of the full-screen option of the user aspect ratio compatibility override, add the property to your app manifest and set the value to
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
The full-screen option is removed from the list of aspect ratio options in device settings. Users won't be able to apply the full-screen override to your app.
Setting this property to
true
has no effect.
Optimize your app for all screens: Don't set aspect ratio restrictions in your app. Use window size classes to support different layouts based on the amount of available display space.
Device manufacturer per-app overrides
Device manufacturers apply overrides on a per‑app basis on select devices. The reference devices may apply some of the overrides to a variety of apps by default.
Apps can opt out of most overrides (see the Per-app overrides table below).
You can test your app with overrides enabled or disabled using the compatibility framework (see Compatibility framework tools ). When enabled, overrides apply to the entire app.
You can also use the Android Debug Bridge (adb) to enable or disable overrides and determine which overrides apply to your app.
Enable or disable overrides as follows:
adb shell am compat enable/disable <override name/id> <package>
For the reference devices , check which overrides apply to your app:
adb shell dumpsys platform_compat | grep <package name>
The following table lists available overrides along with guidance on how to optimize your app so the app does not need to rely on overrides. You can add property flags to your app manifest to opt out of some overrides.
Per-app overrides | |||
---|---|---|---|
Тип | Имя | ИДЕНТИФИКАТОР | Описание |
Resizability | FORCE_RESIZE_APP | 174042936 | Bypasses size compatibility mode for app on configuration changes. |
FORCE_NON_RESIZE_APP | 181136395 | Forces app into size compatibility mode on configuration changes. | |
Соотношение сторон | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Gatekeeper override that must be enabled to apply any other aspect ratio overrides. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | If enabled (the default), limits override scope to portrait-only activities. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Changes the minimum aspect ratio to 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Changes the minimum aspect ratio to 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. Doesn't change whether the app can be put into multi‑window mode, but allows the app to resize without entering size compatibility mode when the screen resizes.
How apps can achieve same result as override
In the app manifest, either set the android:resizeableActivity
attribute to true
or, to support resizing while disabling multi‑window mode with android:resizeableActivity=false
, set the android.supports_size_changes
metadata flag 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.
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_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()
.
How apps can achieve same result as override
Do not set the
android:screenOrientation
manifest attribute, or set the attribute to"user"
.Set the
android:resizeableActivity
manifest attribute totrue
.On small screens, to support app resizing while disabling multi‑window mode with
android:resizeableActivity=false
, set theandroid.supports_size_changes
metadata flag totrue
. Do not setminAspectRatio
andmaxAspectRatio
.
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_OVERRIDE
isn'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
Непригодный. 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
Непригодный. 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
Непригодный. 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.
Дополнительные ресурсы
- Large screen app quality guidelines
- Core app quality guidelines