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

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

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

Андроид 16

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

Следующие переопределения для каждого приложения не работают для приложений, ориентированных на API уровня 36:

Уклоняться

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

Объявить явное имущество

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

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

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

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

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

Справочные устройства

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

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

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

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

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

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

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

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

Проблема

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

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

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

  • resizeableActivity : Указывает, может ли система изменять размер приложений для соответствия окнам различных размеров. В Android 11 (уровень API 30) и ниже определяет, поддерживают ли приложения многооконный режим. В Android 12 (уровень API 31) и выше определяет, поддерживают ли приложения многооконный режим на маленьких экранах ( класс размера окна «compact» ). В Android 12 и выше приложения поддерживают многооконный режим на больших экранах (класс размера окна «medium» или «expanded») независимо от этой настройки.

  • maxAspectRatio : определяет максимальное соотношение сторон, поддерживаемое приложением. Только приложения, у которых resizeableActivity установлен в false могут устанавливать maxAspectRatio .

  • minAspectRatio : определяет минимальное соотношение сторон, поддерживаемое приложением. Только приложения, у которых resizeableActivity установлен в false могут устанавливать minAspectRatio .

Оптимизация

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

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

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

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

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

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

Рисунок 2. Приложение Letterboxed с улучшениями пользовательского интерфейса.

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

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

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

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

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

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

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

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

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

Проблема

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

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

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

Оптимизация

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

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

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

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

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

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

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

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

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

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

Проблема

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

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

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

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

Оптимизация

Приложения не должны делать следующее:

  • Установите ориентацию по умолчанию с помощью Activity#setRequestedOrientation() в методе активности 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 принудительно поворачивает приложение, чтобы выровнять окно портретной ориентации приложения с естественной ориентацией устройства.

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

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

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

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

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

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

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

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

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

Проблема

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

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

Более подробную информацию см. в разделе Поддержка многооконного режима .

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

Оптимизация

Никогда не полагайтесь на физический размер экрана при позиционировании элементов пользовательского интерфейса. Перенесите своё приложение на API, основанные на 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 2019.4 появилась опция Resizable Window для поддержки многооконного режима на Android. Однако первоначальная реализация некорректно реагировала на жизненный цикл активности в многооконном режиме , из-за чего UnityPlayer приостанавливал воспроизведение при потере фокуса. Игрок отображал чёрный экран или последний замороженный кадр игры. Игровой процесс возобновлялся только после касания экрана пользователем. Многие приложения, использующие движок Unity, сталкиваются с этой проблемой и отображают чёрное окно в многооконном режиме.

Оптимизация

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

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

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

Оконный режим рабочего стола

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

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

Анимация изменения размера портретного приложения на альбомную ориентацию.

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

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

Предварительный просмотр камеры в окне рабочего стола

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

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

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

Имеет почтовый ящик

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

Котлин

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

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

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

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

Ява

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

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

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

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

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

Котлин

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

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

Ява

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

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

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

Переопределения для каждого приложения

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

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

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

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

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

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

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

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

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

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

    Установка свойства в true не имеет никакого эффекта.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

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

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

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

    Установка этого свойства в true не имеет никакого эффекта.

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

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

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

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

Вы можете протестировать приложение с включёнными или отключенными переопределениями, используя фреймворк совместимости (см. раздел Инструменты фреймворка совместимости ). При включении переопределения применяются ко всему приложению.

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

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

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

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

adb shell dumpsys platform_compat | grep <package name>

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

Переопределения для каждого приложения
Тип Имя ИДЕНТИФИКАТОР Описание
Возможность изменения размера FORCE_RESIZE_APP 174042936 Обходит режим совместимости размеров приложения при изменении конфигурации.
FORCE_NON_RESIZE_APP 181136395 Переводит приложение в режим совместимости размеров при изменении конфигурации.
Соотношение сторон OVERRIDE_MIN_ASPECT_RATIO 174042980 Переопределение Gatekeeper, которое должно быть включено для применения любых других переопределений соотношения сторон.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Если включено (по умолчанию), ограничивает область переопределения только действиями в портретной ориентации.
OVERRIDE_MIN_ASPECT_RATIO_SMALL 349045028 Изменяет минимальное соотношение сторон на 4:3.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Изменяет минимальное соотношение сторон на 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Изменяет минимальное соотношение сторон на 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Изменяет минимальное соотношение сторон, чтобы оно соответствовало 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 .

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

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

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

Установите для флага свойства 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 и View WindowSizeClass API .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

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

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

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

OVERRIDE_MIN_ASPECT_RATIO_SMALL

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

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

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

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

OVERRIDE_MIN_ASPECT_RATIO_LARGE

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

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

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

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

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

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

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

См. OVERRIDE_MIN_ASPECT_RATIO .

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

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

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

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

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

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

OVERRIDE_ANY_ORIENTATION

Включает следующие переопределения для переопределения любой ориентации:

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

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

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

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

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

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

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

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

OVERRIDE_ANY_ORIENTATION_TO_USER

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

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

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

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

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

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

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

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

См. OVERRIDE_ANY_ORIENTATION .

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

См. OVERRIDE_ANY_ORIENTATION .

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

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

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

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

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

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

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

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

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

См. OVERRIDE_ANY_ORIENTATION .

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

См. OVERRIDE_ANY_ORIENTATION .

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

См. OVERRIDE_ANY_ORIENTATION .

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

См. OVERRIDE_ANY_ORIENTATION .

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

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

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

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

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

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

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Включает ориентацию сенсора для всех действий в пакете. Если 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

Включает обратную альбомную ориентацию для всех действий в пакете. Если 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

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

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

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

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

См. OVERRIDE_ANY_ORIENTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

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

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

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

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

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

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

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

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

См. OVERRIDE_ANY_ORIENTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

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

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

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

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

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

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

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

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

См. OVERRIDE_ANY_ORIENTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

NEVER_SANDBOX_DISPLAY_APIS

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

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

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

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

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

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

Никакого отказа. Миграция с устаревших API.

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

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

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

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

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

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

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

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

ALWAYS_SANDBOX_DISPLAY_APIS

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

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

Объявите действия неизменяемыми, установив для атрибута android:resizeableActivity значение false или для флага метаданных android.supports_size_changes значение 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

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

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

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

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

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

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

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

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

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

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

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

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

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

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

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

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

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

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

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

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

См. OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

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

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

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

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

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

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

См. OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

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

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

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

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

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

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

См. OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

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

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

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

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

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

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

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

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

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

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

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

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

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

Никто.

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

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

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

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

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

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

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

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

Если вы используете игровой движок Unity, обновите его до версии 2019.4.40 или новее и повторно экспортируйте игру. Оставьте флажок «Изменение размера окна» в настройках Android Player .

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

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

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

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

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

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

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

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

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

Включите отображение от края до края или обновите целевой SDK приложения до уровня API 35 или выше. См. следующее:

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

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

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

Включите отображение от края до края или целевой уровень API 35 или выше.

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

Никто.

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

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

adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

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

adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>

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

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


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