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

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

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

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

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

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

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

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

Леттербоксинг

При использовании формата «леттербокс» приложение размещается в центре экрана, а на больших экранах — в одну или другую сторону для удобного доступа. Подложки (сплошные полосы или размытые обои) заполняют неиспользуемую область отображения по бокам или сверху и снизу приложения.

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

Рис. 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. Приложение в формате Letterbox с улучшенным пользовательским интерфейсом.

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

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

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

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

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

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

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

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

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

Проблема

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

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

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

Оптимизация

Приложение должно поддерживать все размеры дисплея. Сделайте свое приложение изменяемым, установив для атрибута 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 для каждого приложения, чтобы обеспечить ложное событие фокуса для приложения в многооконном режиме. Переопределение позволяет действию перерисовывать содержимое и не затемняться.

Проверьте свое приложение на наличие проблем совместимости.

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

В почтовом ящике

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

Котлин

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 значение 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

Позволяет следующим переопределениям переопределить любую ориентацию:

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

Установите 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_REQUESTED_ORIENTATION

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

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

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

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

Смотрите OVERRIDE_ANY_ORIENTATION .

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

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

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

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

команды adb для проверки переопределения

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

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

Never_sandbox_display_apis

Пакеты сил, чтобы никогда не 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 .

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

Установите свойство PROPERTY_COMPAT_ENABLE_FAKE_FOCUS false .

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

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

команды adb для проверки переопределения

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

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

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