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

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

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

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

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

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

Приложение, работающее только в портретной ориентации, в альбомной ориентации, масштаб изменен с помощью управления перезапуском.
Мерцающие петли
Если приложение не поддерживает все ориентации дисплея, оно может многократно запрашивать новые ориентации при изменении конфигурации, создавая бесконечный цикл, из-за которого дисплей будет мерцать или приложение будет бесконечно вращаться.
Проблема
На Android 12 (уровень API 31) и выше производители устройств могут настроить свои устройства так, чтобы они игнорировали ограничения ориентации, указанные приложениями, и вместо этого применяли режимы совместимости. Например, складное устройство может игнорировать настройку android:screenOrientation="portrait"
активности, когда активность отображается на внутреннем экране планшетного размера в альбомной ориентации устройства.
Если ограничения ориентации приложения игнорируются, приложение может программно задать свою ориентацию, вызвав Activity#setRequestedOrientation()
. Вызов запускает перезапуск приложения, если приложение не обрабатывает изменения конфигурации (см. Обработка изменений конфигурации ). После перезапуска ограничения ориентации приложения снова игнорируются, приложение повторяет вызов setRequestedOrientation()
, вызов запускает перезапуск приложения и так далее в самоподдерживающемся цикле.
Другой способ, которым вы можете столкнуться с этим, — когда естественная ориентация ( обычная ориентация, определяемая Android) экрана устройства — альбомная (то есть вызов Display#getRotation()
возвращает Surface.ROTATION_0
, в то время как устройство имеет альбомное соотношение сторон). Исторически приложения предполагали, что Display.getRotation() = Surface.ROTATION_0
означает, что устройство находится в портретной ориентации, но это не всегда так, например, на внутреннем экране некоторых складных устройств и на некоторых планшетах.
Приложение в альбомной ориентации на складном внутреннем дисплее может проверить поворот экрана, получить значение ROTATION_0
, предположить, что естественная ориентация устройства — портретная, и вызвать setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
для перенастройки макета приложения. После перезапуска приложения (в альбомной ориентации) оно может снова проверить поворот экрана, получить значение ROTATION_0
, вызвать setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
и продолжить бесконечный цикл.

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

Приложение обрабатывает изменение конфигурации, не имеет ограничений по ориентации, поэтому не попадает в цикл мерцания.
Обходной путь совместимости
Android игнорирует вызовы Activity#setRequestedOrientation()
в следующих ситуациях:
Действие уже перезапущено из предыдущего вызова метода или включена обработка вращения камеры с учетом совместимости (см. Предварительный просмотр камеры ниже).
Производители устройств могут применить это поведение к приложению с помощью
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Активность сделала более двух запросов ориентации за одну секунду, что указывает на возникновение цикла. Из двух запросов в цикле Android использует тот, который максимизирует область отображения приложения.
Производители устройств могут применить это поведение к приложению с помощью
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.
Предварительный просмотр камеры
Предварительный просмотр камеры (или видоискатель) в приложениях камеры может быть смещен или искажен на планшетах, ноутбуках и складных дисплеях.
Проблема
В документе «Определение совместимости Android» указано, что датчик изображения камеры «ДОЛЖЕН быть ориентирован таким образом, чтобы длинная сторона камеры совпадала с длинной стороной экрана».
Приложения часто предполагают, что ориентация устройства и ориентация датчика камеры являются портретными — разумное предположение для стандартных мобильных телефонов. Но естественная ориентация планшетов и ноутбуков и их датчиков камеры может быть альбомной. Кроме того, новые форм-факторы, такие как складные устройства, могут иметь несколько естественных ориентаций и несколько датчиков камеры в разных ориентациях.
Запуск действия с ориентацией камеры, которую приложение не ожидает, или переключение между разными камерами или экранами устройств (для складных устройств) может привести к смещению или искажению предварительного просмотра камеры.

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

Предварительный просмотр камеры правильно выровнен и масштабирован во всех ориентациях устройства.
Обходной путь совместимости
Устройство находится в естественной ориентации, когда Display#getRotation()
возвращает Surface.ROTATION_0
. Система вычисляет CameraCharacteristics.SENSOR_ORIENTATION
из естественной ориентации устройства. Android выравнивает портретное окно приложений с ограничением по портретной ориентации с естественной ориентацией устройства, чего и ожидают большинство приложений. Android также обрезает изображение с датчика камеры, когда ориентация датчика альбомная, а предварительный просмотр камеры — портретный. Конкретные обходные пути включают следующее:
Принудительно поворачивать предварительные просмотры камеры для приложений с ограничением по портретной ориентации: приложения, ограниченные портретной ориентацией, ожидают, что естественная ориентация устройства и ориентация датчика камеры будут портретными. Однако на Android 12 (уровень API 31) и выше приложения могут работать в нескольких ориентациях устройства, если производители устройств игнорируют спецификацию ориентации.
Когда к камере подключено приложение с ограничением по портретной ориентации, Android принудительно поворачивает приложение, чтобы выровнять окно портретной ориентации приложения с естественной ориентацией устройства.
На некоторых планшетах (см. справочные устройства ) окно портрета приложения поворачивается в полноэкранный портрет, чтобы соответствовать естественной ориентации устройства. Приложение занимает весь экран после принудительного поворота.
Планшет — Принудительный поворот приложения, ограниченного портретной ориентацией.
На внутреннем экране складных устройств в альбомной ориентации (см. справочные устройства ) действия, доступные только в портретной ориентации, поворачиваются в альбомную ориентацию для соответствия естественной ориентации в разложенном состоянии. После принудительного поворота приложение становится в почтовом ящике.
Складной — Принудительный поворот приложения с ограничением по портретной ориентации. Приложение также имеет формат letterbox.
Обрезка внутренней фронтальной камеры: датчик внутренней фронтальной камеры на некоторых складных устройствах имеет альбомную ориентацию. Помимо принудительного поворота предварительного просмотра камеры на складном внутреннем дисплее, Android обрезает поле зрения внутренней фронтальной (альбомной) камеры, чтобы датчик захватывал вид, противоположный ориентации устройства.
Принудительное обновление предпросмотров камеры: система циклически проходит через методы активности
onStop()
иonStart()
(по умолчанию) илиonPause()
иonResume()
(применяются переопределением OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE для каждого приложения) после принудительного поворота, чтобы убедиться, что предварительный просмотр камеры отображается правильно.Масштабирование соотношения сторон: система динамически изменяет соотношение сторон принудительно повернутого предварительного просмотра камеры до более высокого минимального соотношения сторон, что обеспечивает правильное масштабирование предварительного просмотра камеры.
Разработчики приложений могут переопределить эти обходные пути, если приложения правильно обрабатывают предварительный просмотр камеры. См. Переопределения для каждого приложения .
API, которые часто используются неправильно
Поскольку Android добавил поддержку таких функций, как многооконный режим и такие устройства, как складные устройства, устаревшие API были объявлены устаревшими и заменены современными API, которые работают для всех размеров дисплеев и форм-факторов устройств. Однако устаревшие API по-прежнему доступны для обратной совместимости.
Некоторые API View
предназначены для специальных целей, которые не всегда хорошо понятны разработчикам.
Проблема
Разработчики продолжают использовать устаревшие API Display
и ошибочно предполагают, что API возвращают границы приложения вместо границ области отображения устройства. Или разработчики ошибочно используют API представления специального назначения для получения общих показателей отображения. Результатом являются неверные расчеты при изменении положения элементов пользовательского интерфейса после событий изменения размера окна приложения, что приводит к проблемам с макетом.
Устаревшие и часто неправильно используемые API отображения:
Более подробную информацию см. в разделе Поддержка многооконного режима .
Неправильно используемые API представления:

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

API корректно рассчитывает метрики окна приложения.
Обходной путь совместимости
Два переопределения настраивают устаревшие API Display
и неправильно используемые API View
для возврата границ приложения: ALWAYS_SANDBOX_DISPLAY_APIS
для API Display
; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
для API View
. ALWAYS_SANDBOX_DISPLAY_APIS
также применяется по умолчанию к приложениям, которые соответствуют требованиям режима совместимости размеров.
Прозрачная деятельность
Прозрачные действия являются результатом прозрачных стилей фона, например:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Темы, связанные с диалогами, такие как Theme.MaterialComponents.Dialog
, могут включать стили, которые делают действия прозрачными.
Прозрачные действия не охватывают все доступное пространство дисплея, что затрудняет управление ими, поскольку доступная область отображения может меняться в зависимости от изменений конфигурации, таких как поворот устройства, складывание и раскладывание устройства, а также многооконный режим.
Проблема
Прозрачная активность должна соответствовать границам первой непрозрачной активности ниже прозрачной активности в стеке задач активности. Однако непрозрачная активность, которая запускает диалог разрешения, может быть трамплином (активностью, которая запускает другую активность, а затем исчезает); и поэтому система не может определить границы активности трамплина, которая запустила прозрачную активность диалога разрешения.

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

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

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

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

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

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

Изменение размера окна с помощью видоискателя камеры
Проверьте свое приложение на наличие проблем совместимости
Чтобы протестировать свое приложение и понять, как оно ведет себя на устройствах разных форм-факторов, воспользуйтесь следующими ресурсами:
- Потоковая передача данных с устройств: Чтобы протестировать приложение на рабочих устройствах (включая эталонные устройства ), размещенных в центрах обработки данных Google, см. раздел Потоковая передача данных с устройств Android на базе Firebase.
- Эмуляторы в Android Studio Hedgehog: Информацию о создании эмуляторов для эталонных устройств см. в разделе Создание и управление виртуальными устройствами.
- Эмулятор Android Studio с изменяемым размером: Информацию о доступе к виртуальным устройствам см. в разделе Запуск приложений на эмуляторе Android.
Имеет почтовый ящик
Убедитесь, что каждое действие может использовать все пространство дисплея, доступное приложению. Сначала объявите следующий код в вашей тестовой папке:
Котлин
fun isLetterboxed(activity: AppCompatActivity): Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Ява
public boolean isLetterboxed(AppCompatActivity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds(); Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
Затем запустите тест, чтобы подтвердить поведение и убедиться, что целевая активность не является letterboxed:
Котлин
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Ява
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); @Test public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity( activity -> { assertFalse(isLetterboxed(activity)); }); } }
В идеале запускайте этот тип теста только до тех пор, пока он не пройдет и не подтвердит, что действия вашего приложения занимают все доступное приложению пространство дисплея. Протестируйте свое приложение на всех типах устройств, чтобы убедиться в единообразном поведении.
Переопределения для каждого приложения
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 | Переопределение Gatekeeper, которое должно быть включено для применения любых других переопределений соотношения сторон. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Если включено (по умолчанию), область переопределения ограничивается только действиями в портретной ориентации. | |
OVERRIDE_MIN_ASPECT_RATIO_SMALL | 349045028 | Изменяет минимальное соотношение сторон на 4:3. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Изменяет минимальное соотношение сторон на 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Изменяет минимальное соотношение сторон на 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Изменяет минимальное соотношение сторон, чтобы соответствовать 50% размера дисплея (или соотношению сторон разделенного экрана). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Отключает переопределение минимального соотношения сторон, чтобы приложения отображались на весь экран, когда устройство находится в портретной ориентации. | |
Ориентация | ПЕРЕОПРЕДЕЛИТЬ_ЛЮБУЮ_ОРИЕНТАЦИЮ | 265464455 | Позволяет переопределять любую ориентацию. |
ПЕРЕОПРЕДЕЛИТЬ_ЛЮБУЮ_ОРИЕНТАЦИЮ_НА_ПОЛЬЗОВАТЕЛЯ | 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 | Устанавливает фиксированную альбомную естественную ориентацию дисплея, когда задача отображается на весь экран (в том числе в режиме Letterbox). | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Игнорирует запросы ориентации от приложения, чтобы избежать бесконечных циклов вращения. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Игнорирует повторные запросы ориентации, пока активность перезапускается. Если Android обнаруживает, что приложение запрашивает не менее двух новых ориентаций в течение одной секунды, система считает это бесконечным циклом вращения и применяет переопределение. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Предотвращает появление почтовых ящиков, отключая параметр игнорирования запроса ориентации производителем устройства. | |
API-интерфейсы песочницы | НИКОГДА_ПЕСОЧНАЯ_БОКС_ОТОБРАЖЕНИЕ_APIS | 184838306 | Предотвращает изменение поведения любых API отображения. |
ВСЕГДА_SANDBOX_DISPLAY_API | 185004937 | Заставляет Display API в приложении возвращать границы приложения. Display API возвращают логические границы области отображения, но иногда приложение предполагает, что Display API возвращают границы приложения, что приводит к проблемам с пользовательским интерфейсом. | |
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Заставляет View API, используемые в приложении, возвращать границы приложения. View API возвращают логические границы области отображения, но иногда приложение предполагает, что View API возвращают границы приложения, что приводит к проблемам с пользовательским интерфейсом. | |
Совместимость с камерой | 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
.
Как оптимизировать приложения
Используйте адаптивные/адаптивные макеты, чтобы позволить приложениям адаптироваться ко всем размерам отображения и соотношения сторон. См. Поддержка разных размеров дисплея .
Как отключить или отказаться от переопределения
Установите свойство свойства свойства 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_small
Устанавливает минимальное соотношение сторон активности до небольшого значения (4: 3).
Как приложения могут достичь того же результата, что и переопределение
См. Override_min_aspect_ratio .
Как оптимизировать приложения
См. Override_min_aspect_ratio .
Как отключить или отказаться от переопределения
См. Override_min_aspect_ratio .
Флаги свойств для настройки переопределения
См. Override_min_aspect_ratio .
Команды ADB для проверки переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Чтобы удалить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Примечание. Команды только временно применяют или удалили переопределение.
Override_min_aspect_ratio_medium
Устанавливает минимальное соотношение сторон активности к среднему значению (3: 2).
Как приложения могут достичь того же результата, что и переопределение
См. Override_min_aspect_ratio .
Как оптимизировать приложения
См. Override_min_aspect_ratio .
Как отключить или отказаться от переопределения
См. Override_min_aspect_ratio .
Флаги свойств для настройки переопределения
См. Override_min_aspect_ratio .
Команды ADB для проверки переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Чтобы удалить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Примечание. Команды только временно применяют или удалили переопределение.
Override_min_aspect_ratio_large
Устанавливает минимальное соотношение сторон активности к большому значению (16: 9).
Как приложения могут достичь того же результата, что и переопределение
См. Override_min_aspect_ratio .
Как оптимизировать приложения
См. Override_min_aspect_ratio .
Как отключить или отказаться от переопределения
См. Override_min_aspect_ratio .
Флаги свойств для настройки переопределения
См. Override_min_aspect_ratio .
Команды ADB для проверки переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
Чтобы удалить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Примечание. Команды только временно применяют или удалили переопределение.
Override_min_aspect_ratio_to_align_with_split_screen
Позволяет использовать соотношение сторон раздельного экрана. Позволяет приложению использовать все доступное пространство в режиме разделенного экрана, избегая почтовой коробки.
Как приложения могут достичь того же результата, что и переопределение
См. Override_min_aspect_ratio .
Как оптимизировать приложения
См. Override_min_aspect_ratio .
Как отключить или отказаться от переопределения
См. Override_min_aspect_ratio .
Флаги свойств для настройки переопределения
См. Override_min_aspect_ratio .
Команды ADB для проверки переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Чтобы удалить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Примечание. Команды только временно применяют или удалили переопределение.
Override_min_aspect_ratio_exclude_portrait_fullscreen
Отключает переопределение минимального соотношения сторон в полноэкране портрета, чтобы использовать все доступное пространство экрана.
Как приложения могут достичь того же результата, что и переопределение
См. Override_min_aspect_ratio .
Как оптимизировать приложения
См. Override_min_aspect_ratio .
Как отключить или отказаться от переопределения
См. Override_min_aspect_ratio .
Флаги свойств для настройки переопределения
См. Override_min_aspect_ratio .
Команды ADB для проверки переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Чтобы удалить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Примечание. Команды только временно применяют или удалили переопределение.
Override_any_orientation
Позволяет следующим переопределениям переопределить любую ориентацию:
- 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>
Примечание. Команды только временно применяют или удалили переопределение.