Android активирует режим совместимости для приложений, в которых указаны ограничения на ориентацию или изменение размера. Режим совместимости обеспечивает приемлемую работу приложения на устройствах с большим экраном, складных телефонах и компьютерах, но удобство использования будет неоптимальным.
Переопределения для приложений позволяют производителям устройств, владельцам виртуальных устройств1 и пользователям изменять поведение приложений, чтобы улучшить их макет или предотвратить сбои на определенных устройствах.
Android 16
В Android 16 (уровень API 36) игнорируются ограничения на ориентацию экрана, соотношение сторон и изменение размера приложений, чтобы улучшить макет приложений на устройствах с минимальной шириной экрана 600 dp и более.
Следующие переопределения для приложений не работают, если целевой уровень API приложения – 36:
- FORCE_RESIZE_APP
- FORCE_NON_RESIZE_APP
- OVERRIDE_MIN_ASPECT_RATIO
- OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
- OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
- OVERRIDE_MIN_ASPECT_RATIO_LARGE
- OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
- OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
- OVERRIDE_ANY_ORIENTATION
- OVERRIDE_ANY_ORIENTATION_TO_USER
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
- OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
- OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
- OVERRIDE_RESPECT_REQUESTED_ORIENTATION
- OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
Отключить
Ваше приложение может быть предназначено для целевого уровня API 36, но не использовать поведение Android 16. В этом случае OVERRIDE_ANY_ORIENTATION_TO_USER не применяется.
Как объявить свойство манифеста
Чтобы отказаться от поведения уровня API 36, объявите свойство манифеста PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY .
Чтобы отказаться от участия в определенном действии, задайте соответствующее свойство в элементе <activity> :
<activity ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</activity>
Чтобы исключить эту функцию для всего приложения, установите соответствующее свойство в элементе <application> :
<application ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</application>
Если ваше приложение ориентировано на Android 16 (уровень API 36) или выше, это свойство не блокирует ориентацию экрана и не предотвращает поворот экрана на больших дисплеях.
Эталонные устройства
Для следующих устройств может потребоваться переопределение настроек на уровне приложений из-за необычных конфигураций или конфигураций, которые плохо поддерживаются приложениями:
- Планшеты. Некоторые планшеты, например 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– максимальное соотношение сторон, поддерживаемое приложением. Установить значениеmaxAspectRatioмогут только приложения, в которых для параметраresizeableActivityзадано значениеfalse.minAspectRatio– минимальное соотношение сторон, поддерживаемое приложением. Задать значение для атрибутаminAspectRatioможно только в том случае, если для атрибутаresizeableActivityзадано значениеfalse.
Приложение, которое можно использовать только в вертикальной ориентации, не работает на устройстве, ориентированном горизонтально.
Оптимизация
Приложение должно поддерживать все ориентации и размеры экрана, а также многооконный режим. Удалите все ограничения ориентации и фиксированного соотношения сторон из макетов приложения и файла манифеста.
Приложение поддерживает все ориентации устройства.
Обходные решения для обеспечения совместимости
Если приложение с фиксированной ориентацией или соотношением сторон запускается в окне, размер или ориентация которого не поддерживаются приложением напрямую, Android добавляет черные полосы, чтобы сохранить непрерывность.
Начиная с Android 12 (уровень API 31) и продолжая в 12L (уровень API 32), платформа применяет различные улучшения к приложениям с черными полосами. Производители устройств реализуют улучшения интерфейса. Чтобы воспользоваться преимуществами улучшений, вам не нужно вносить в приложение дополнительные изменения.
В Android 12 (уровень API 31) добавлены следующие улучшения, которые могут настраивать производители устройств:
- Закругленные углы. Углы окна приложения выглядят более изящно.
- Прозрачность системной строки. Строка состояния и панель навигации, которые накладываются на приложение, полупрозрачны, поэтому значки на них всегда видны на фоне черных полос.
- Настраиваемое соотношение сторон. Соотношение сторон приложения можно изменить, чтобы улучшить его внешний вид.
Рисунок 2. Приложение с черными полосами и улучшенным интерфейсом.
В версии 12L (уровень API 32) добавлены следующие функциональные улучшения:
Настраиваемое расположение. На больших экранах производители устройств могут размещать приложение в левой или правой части дисплея, чтобы пользователям было удобнее взаимодействовать с ним.
Новый дизайн кнопки перезапуска. Производители устройств могут изменить внешний вид кнопки перезапуска для режима совместимости размеров, чтобы пользователям было проще ее распознавать.
В Android 13 (уровень API 33) добавлено диалоговое окно с информацией о том, как разместить приложение с черными полосами на экране или включить эти полосы в режим разделенного экрана:
Рисунок 3. Приложение с черными полосами и диалоговым окном с информацией для пользователя.
Режим совместимости размеров
Режим совместимости размеров – это режим, в котором приложение запускается с сохранением соотношения сторон, но с черными полосами по краям. В нем также есть кнопка перезапуска. С помощью этого элемента управления пользователи могут перезапустить приложение и перерисовать экран. Android вызывает режим совместимости размеров для приложений, которые нельзя изменять. Если приложение переносится в контейнер, несовместимый с его размерами, система может изменить масштаб приложения, чтобы оно занимало весь экран устройства хотя бы по одной оси.
Изменения конфигурации устройства, которые могут активировать режим совместимости размеров, включают:
- Поворот устройства
- Складное устройство в сложенном и разложенном виде
- Как переключаться между полноэкранным режимом и режимом разделения экрана
Проблема
Режим совместимости размеров обычно применяется к действиям, которые ограничены в ориентации или соотношении сторон и настроены (или определены системой) как не изменяемые.
Приложение считается изменяемым и не будет переведено в режим совместимости по размеру, если оно соответствует хотя бы одному из следующих критериев:
- Можно изменять размер с помощью
resizeableActivity="true". - Поддерживает режим картинка в картинке.
- Встроенный
- Применен ли переопределяющий параметр
FORCE_RESIZE_APPдля каждого приложения, заданный производителем устройства (свойства, заданные приложением, игнорируются).
Если приложение не соответствует ни одному из условий, оно считается не масштабируемым и может быть запущено в режиме совместимости размеров.
Приложение с фиксированным размером окна аварийно завершает работу в многооконном режиме.
Оптимизация
Приложение должно поддерживать все размеры экрана. Чтобы сделать приложение изменяемым, задайте атрибуту android:resizeableActivity элемента <activity> или <application> значение true в манифесте приложения. Создайте для приложения адаптивные макеты. Подробнее о том, как поддерживать разные размеры экрана и как поддерживать многооконный режим…
Приложение работает с окнами любого размера.
Обходные решения для обеспечения совместимости
Android переводит приложение в режим совместимости по размеру, когда система определяет, что показ приложения в режиме леттербокса можно улучшить, изменив его масштаб так, чтобы оно занимало все окно хотя бы по одному измерению. Система отображает элемент управления перезапуском, который воссоздает процесс приложения, воссоздает действие и перерисовывает дисплей. Также ознакомьтесь с обзором процессов и потоков.
Приложение, поддерживающее только вертикальную ориентацию, в горизонтальной ориентации показывается в окне с черными полосами по бокам. Масштаб изменен с помощью элемента управления перезапуском.
Режим совместимости дисплея
Режим совместимости с дисплеем предотвращает перезапуск приложения при его перемещении между разными дисплеями, что может вызвать изменение конфигурации, например цветового режима, доступности сенсорного экрана или плотности пикселей.
Режим совместимости дисплея включен по умолчанию для игр (на основе флага android:appCategory), чтобы повысить стабильность и непрерывность работы.
В отличие от режима совместимости размеров, режим совместимости дисплея не замораживает конфигурацию приложения. Приложение по-прежнему может получать все обновления конфигурации через API, например обратный вызов onConfigurationChanged(), но при этом не будет перезапускаться. Это означает, что игры, которые правильно поддерживают API, например onConfigurationChanged(), могут быстро обновлять свой интерфейс, даже если они находятся в режиме совместимости с дисплеем.
Чтобы отключить режим совместимости с дисплеем и обрабатывать изменения конфигурации в приложении, объявите поддержку изменений конфигурации в файле AndroidManifest.xml приложения и обработайте изменения конфигурации в обратном вызове onConfigurationChanged().
<activity
android:name=".MyGameActivity"
android:configChanges="colorMode|touchscreen|density|...">
...
</activity>
Мерцающие петли
Если приложение не поддерживает все ориентации экрана, при изменении конфигурации оно может многократно запрашивать новые ориентации. Это приводит к бесконечному циклу, из-за которого экран мерцает или приложение постоянно поворачивается.
Проблема
На устройствах с Android 12 (уровень API 31) и более поздних версий производители могут настроить игнорирование ограничений ориентации, заданных приложениями, и вместо этого принудительно использовать режимы совместимости. Например, складное устройство может игнорировать настройку android:screenOrientation="portrait" для действия, если оно отображается на внутреннем экране устройства в альбомной ориентации и размере планшета.
Если ограничения ориентации приложения игнорируются, оно может программно задать ориентацию, вызвав метод Activity#setRequestedOrientation(). Если приложение не обрабатывает изменения конфигурации (см. Обработка изменений конфигурации), вызов приведет к его перезапуску. После перезапуска ограничения ориентации приложения снова игнорируются, приложение повторяет вызов setRequestedOrientation(), вызов запускает перезапуск приложения и так далее по кругу.
Другой вариант, при котором может возникнуть эта проблема, – когда естественная ориентация (обычная ориентация, определяемая Android) экрана устройства является горизонтальной (то есть при вызове Display#getRotation() возвращается Surface.ROTATION_0, хотя устройство имеет горизонтальное соотношение сторон). Раньше разработчики приложений считали, что Display.getRotation() =
Surface.ROTATION_0 означает, что устройство находится в портретной ориентации, но это не всегда так, например на внутреннем экране некоторых складных устройств и на некоторых планшетах.
Приложение, работающее в горизонтальной ориентации на внутреннем экране складного устройства, может проверить поворот экрана, получить значение ROTATION_0, предположить, что естественная ориентация устройства – вертикальная, и вызвать setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
), чтобы перенастроить макет приложения. После перезапуска приложения (в альбомной ориентации) оно может снова проверить поворот экрана, получить значение ROTATION_0, вызвать setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) и продолжить бесконечный цикл.
Приложение, предназначенное только для альбомной ориентации, на экране с книжной ориентацией многократно вызывает функцию Activity#setRequestedOrientation().
Оптимизация
Приложения не должны:
- Задайте ориентацию по умолчанию с помощью
Activity#setRequestedOrientation()в методеonCreate(), поскольку запрос ориентации может быть неожиданно вызван необработанными изменениями конфигурации. - Предполагается, что естественная ориентация устройства (
ROTATION_0) – вертикальная. - Ориентация задается на основе сигналов, не связанных с текущим размером окна, например
Display#getRotation(), наличияFoldingFeatureили устаревших API.
Приложение обрабатывает изменение конфигурации, не имеет ограничений на ориентацию, поэтому не входит в цикл мерцания.
Обходные решения для обеспечения совместимости
Android игнорирует вызовы Activity#setRequestedOrientation() в следующих ситуациях:
Активность уже перезапущена после предыдущего вызова метода или включена принудительная ротация для совместимости с камерой (см. раздел Предварительный просмотр камеры ниже).
Производители устройств могут применить такое поведение к приложению с помощью тега
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.Объект activity отправил более двух запросов ориентации за одну секунду, что указывает на наличие цикла. Из двух запросов в цикле 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 предназначены для специальных целей, которые не всегда понятны разработчикам.
Проблема
Разработчики продолжают использовать устаревшие Display API и ошибочно полагают, что эти API возвращают границы приложения, а не границы области экрана устройства. Иногда разработчики по ошибке используют API представлений специального назначения для получения общих показателей.
В результате при изменении размера окна приложения неправильно рассчитывается положение элементов интерфейса, что приводит к проблемам с макетом.
Устаревшие и часто неправильно используемые API для медийной рекламы:
Подробнее о поддержке многооконного режима…
Неправильное использование API для просмотра:
Неподдерживаемый API неправильно рассчитывает границы приложения. Контент приложения выходит за пределы экрана.
Оптимизация
Никогда не используйте физический размер экрана для позиционирования элементов интерфейса. Перенесите приложение на API, основанные на WindowMetrics, в том числе на следующие API WindowManager:
Платформа:
Jetpack:
API правильно рассчитывает показатели окна приложения.
Обходные решения для обеспечения совместимости
Два переопределения корректируют устаревшие API Display и неправильно используемые API View, чтобы возвращать границы приложения: ALWAYS_SANDBOX_DISPLAY_APIS для API Display; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS для API View. ALWAYS_SANDBOX_DISPLAY_APIS также применяется по умолчанию к приложениям, которые соответствуют требованиям для режима совместимости.
Прозрачность действий
Прозрачные действия являются результатом использования прозрачных стилей фона, например:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Темы, связанные с диалоговыми окнами, например Theme.MaterialComponents.Dialog, могут включать стили, которые делают действия прозрачными.
Прозрачные окна занимают не все доступное пространство экрана, поэтому ими сложно управлять, поскольку доступная область экрана может меняться в зависимости от конфигурации, например при повороте устройства, его складывании и раскладывании, а также при использовании многооконного режима.
Проблема
Прозрачный объект Activity должен соответствовать границам первого непрозрачного объекта Activity, расположенного ниже в стеке объектов activity задачи. Однако непрозрачное действие, запускающее диалоговое окно с запросом разрешения, может быть трамплином (действием, которое запускает другое действие, а затем исчезает). В этом случае система не может определить границы действия-трамплина, запустившего прозрачное диалоговое окно с запросом разрешения.
Диалоговое окно неправильно расположено, поскольку действие было запущено из трамплина.
Оптимизация
Ограничения прозрачных действий наследуются от самого верхнего непрозрачного действия в стеке объектов activity задачи. Непрозрачное действие должно быть доступно на протяжении всего жизненного цикла прозрачного действия, от создания до уничтожения. По этой причине не запускайте запросы разрешений из действий-трамплинов.
Если активность-трамплин запускает запрос разрешения, пользователь может не увидеть диалоговое окно, поскольку активность-трамплин будет уничтожена до того, как пользователь успеет ответить на запрос. Кроме того, размеры и положение диалогового окна могут быть рассчитаны неправильно.
Приложения всегда должны запускать запросы разрешений из действий, которые остаются видимыми, пока пользователь не примет решение.
Скругленные углы
Активность может быть прозрачной, если в ее стиле задана прозрачность фона или если ее содержимое не занимает все доступное пространство экрана. Если прозрачное окно занимает все доступное пространство экрана, система автоматически применяет к нему скругленные углы, если это предусмотрено производителем устройства. Однако если прозрачное окно (например, диалоговое окно с запросом разрешения) не занимает все доступное пространство, вы сами решаете, применять ли скругленные углы.
Диалоговые окна с запросом разрешений не занимают все доступное пространство экрана, поскольку в макете диалогового окна обычно используется LayoutParams.WRAP_CONTENT, а не LayoutParams.MATCH_PARENT.
Диалоговое окно с закругленными углами правильно расположено над видимым действием запуска.
Обходные решения для обеспечения совместимости
Сохраняйте видимость действий, запускающих диалоговые окна, пока пользователь не ответит на запрос в диалоговом окне.
Система гарантирует, что прозрачное действие наследует все ограничения от первого непрозрачного действия, расположенного под ним в стеке объектов activity, в том числе ограничения, связанные с:
- Режим совместимости размеров
- Ориентация
- Соотношение сторон
Игры Unity
Игры Unity запускаются на устройствах Android в полноэкранном или многооконном режиме. Однако многие игры Unity теряют фокус и перестают отрисовывать контент, когда приложение переходит в режим многозадачности.
Проблема
В Unity 2019.4 добавлена Resizable Window, позволяющая поддерживать многооконный режим в Android. Однако в исходной реализации не было корректной реакции на жизненный цикл объекта activity в многооконном режиме, из-за чего UnityPlayer приостанавливал воспроизведение, когда приложение теряло фокус. В проигрывателе показывается черный экран или последний кадр игры. Воспроизведение игры возобновлялось только после того, как пользователь нажимал на экран. Многие приложения, использующие движок Unity, сталкиваются с этой проблемой и отображаются в многооконном режиме как черное окно.
В многооконном режиме игра теряет фокус и отображается как черное окно.
Оптимизация
Обновите Unity до версии 2019.4.40 или более поздней и экспортируйте игру заново. В настройках проигрывателя Android должен быть установлен флажок Resizable Window. В противном случае игра будет приостанавливаться, когда она не в фокусе, даже если она полностью видна в многооконном режиме.
Игра корректно отображает контент в многооконном режиме, даже если она не в фокусе.
Обходное решение для совместимости
Производители устройств могут применить переопределение OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS для каждого приложения, чтобы предоставить приложению в многооконном режиме ложное событие фокуса. Переопределение позволяет действию перерисовывать контент и не затемнять его.
Многооконный режим
При запуске приложений в многооконном режиме могут возникать дополнительные проблемы с совместимостью.
Приложения с заблокированной ориентацией можно свободно изменять. Даже если для действия задана книжная ориентация, пользователи могут изменить размер приложения на альбомную.
Приложения с заблокированной ориентацией можно свободно изменять в размере.
Однако если для действия задано значение resizeableActivity = false, интерфейс действия масштабируется с сохранением соотношения сторон.
Интерфейс действий, которые нельзя изменять, масштабируется.
Предпросмотр камеры в оконном режиме на компьютере
Когда приложение работает в многооконном режиме, ориентация экрана и окна может отличаться от той, которая используется в полноэкранном режиме на обычных телефонах.
Проблема
Приложения часто предполагают, что ориентация устройства и датчика камеры – портретная, из-за чего предпросмотр камеры может быть смещен или искажен.
Оптимизация
Приложения для работы с камерой должны правильно определять и учитывать ориентацию устройства и датчика камеры, чтобы показывать правильно выровненное и масштабированное изображение с камеры. Приложения должны рассчитывать поворот устройства, поворот датчика и соотношение сторон окна, а затем применять результаты к предпросмотру камеры, который также должен реагировать на изменения конфигурации окна. Подробнее о предварительном просмотре камеры…
Обходные решения для обеспечения совместимости
Когда приложения с фиксированной ориентацией в режиме окон на рабочем столе запускают предпросмотр камеры, система может активировать обработку совместимости камеры, чтобы избежать растянутых и перевернутых изображений.
Песочница для обработки позволяет настроить ориентацию экрана следующими способами:
Добавьте в окно приложения черные полосы, чтобы оно соответствовало запрошенной ориентации. Это позволит избежать проблем с растягиванием из-за неправильного масштабирования.
Изолировать поворот экрана. Экспериментальная группа имитирует устройство, размещенное в запрошенной ориентации. Поскольку чаще всего при предпросмотре камеры ошибочно предполагается, что приложение запущено на устройстве с портретной ориентацией, поворот экрана ограничивается 0 градусами для приложений, запрашивающих портретную ориентацию, и 90 градусами для устройств, запрашивающих альбомную ориентацию.
Кадрирование изображения с камеры. Если ориентация экрана изменилась, это отразится на видеопотоке с камеры. Например, если устройство находится в горизонтальном расположении, а приложение запрашивает вертикальное расположение, зона обзора камеры будет кадрирована так, чтобы напоминать портретную ориентацию.
Поворот и обрезка изображения с камеры. Система переключается между методами activity
onStop()иonStart()(по умолчанию) илиonPause()иonResume()(применяется переопределение OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE для приложения) после применения обработки, чтобы убедиться, что предварительный просмотр камеры отображается правильно.
Разработчики приложений могут отменить эти обходные пути, если приложения правильно обрабатывают предварительный просмотр камеры. Подробнее о переопределении настроек для отдельных приложений…
Изменение размера
Если активен экспериментальный вариант с запрошенной ориентацией, при изменении размера окна интерфейс видоискателя масштабируется с сохранением соотношения сторон. Размер остальной части окна приложения можно изменять.
Изменение размера окна с видоискателем камеры
Как проверить приложение на наличие проблем с совместимостью
Чтобы протестировать приложение и понять, как оно работает на устройствах разных форм-факторов, воспользуйтесь следующими ресурсами:
- Потоковая передача данных с устройства. Чтобы протестировать приложение на производственных устройствах (в том числе референсных), размещенных в центрах обработки данных Google, ознакомьтесь с информацией о потоковой передаче данных с устройств Android на базе Firebase .
- Эмуляторы в Android Studio. Чтобы узнать, как создавать эмуляторы для референсных устройств, ознакомьтесь с разделом Как создавать виртуальные устройства и управлять ими.
- Эмулятор с изменяемым размером экрана в Android Studio. Чтобы узнать, как получить доступ к виртуальным устройствам, ознакомьтесь с разделом Запуск приложений в эмуляторе Android.
Леттербокс
Убедитесь, что каждое действие может использовать все доступное приложению пространство экрана. Сначала объявите следующий код в тестовой папке:
Kotlin
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() } }
Java
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(); }
Затем запустите тест, чтобы проверить поведение и убедиться, что целевое действие не ограничено рамками:
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Java
@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>
В таблице ниже перечислены доступные переопределения и приведены рекомендации по оптимизации приложения, чтобы оно не полагалось на переопределения. Вы можете добавить в манифест приложения флаги свойств, чтобы отказаться от некоторых переопределений.
| Переопределение настроек для отдельных приложений | |||
|---|---|---|---|
| Тип | Название | ID | Описание |
| Совместимость с вводом | OVERRIDE_MOUSE_TO_TOUCH | 413207127 | Преобразует экземпляры MotionEvent с устройства мыши в события касания, переписывая источник и тип инструмента MotionEvent при доставке в приложение. |
| Изменение размера | 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 | Отключает режим Letterbox, запрещая игнорировать запрос на изменение ориентации от производителя устройства. | |
| API песочницы | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Запрещает изменять поведение любых API дисплея. |
| ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Заставляет API Display в приложении возвращать границы приложения. Display API возвращают логические границы области отображения, но иногда приложение предполагает, что Display API возвращают границы приложения, что приводит к проблемам с интерфейсом. |
|
| OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Принудительно возвращает границы приложения для API View, используемых в приложении. View API возвращают логические границы области отображения, но иногда приложение предполагает, что View API возвращают границы приложения, что приводит к проблемам с интерфейсом. |
|
| Совместимость с камерой | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Отключает принудительный поворот экрана. По умолчанию все приложения для камер с фиксированной ориентацией принудительно поворачиваются, когда открыт предварительный просмотр камеры. |
| OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION | 398195815 | Отключает имитацию запрошенной ориентации для обеспечения совместимости с камерой. По умолчанию приложения с фиксированной ориентацией камеры настраиваются в соответствии с запрошенной ориентацией, когда открыт предварительный просмотр камеры. | |
| 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 отправлять в приложение фиктивное событие фокуса, которое указывает приложению начать снова отрисовывать контент. |
OVERRIDE_MOUSE_TO_TOUCH
Включает обработку совместимости, которая преобразует экземпляры MotionEvent от мыши или сенсорной панели в события касания, переписывая источникMotionEvent на SOURCE_TOUCHSCREEN и тип инструментаMotionEvent на TOOL_TYPE_FINGER, когда события движения доставляются в приложение.
Как приложения могут достичь того же результата, что и переопределение
Неприменимо. Проблема должна быть решена в логике приложения.
Как оптимизировать приложения
Приложение должно обрабатывать события ввода с мыши и сенсорной панели, в том числе жесты на сенсорной панели и прокрутку колесиком мыши. Подробнее о клавиатуре, мыши и сенсорной панели…
Как отключить переопределение
Объявите FEATURE_PC в элементе <uses-feature> в манифесте приложения.
<uses-feature android:name="android.hardware.type.pc"
android:required="false" />
Примечание. Установите значение android:required="false", чтобы функция для ПК была необязательной и Google Play не исключал приложение на устройствах, отличных от ПК.
Флаги ресурса для настройки переопределения
Нет.
Команды adb для тестирования переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>
Чтобы отменить переопределение:
adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>
Примечание. Команды временно применяют или отменяют переопределение.
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 в манифесте приложения и объявите ограничение на ориентацию или соотношение сторон.
Как оптимизировать приложения
Все приложения, которые корректно работают при изменении размера, должны иметь значение true для атрибута android:resizeableActivity или android.supports_size_changes.
Другие приложения должны быть оптимизированы для работы в режиме изменения размера. Подробнее о параметре 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 на уровне приложения или действий.
Как оптимизировать приложения
Не задавайте в приложении ограничения на соотношение сторон. Убедитесь, что приложение поддерживает экраны разных размеров. Используйте классы размера окна, чтобы поддерживать разные макеты в зависимости от того, сколько места на экране занимает приложение. Подробнее о Compose WindowSizeClass API и 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.
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды 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).
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды 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).
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды 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).
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды 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
Включает использование соотношения сторон для разделенного экрана. Позволяет приложению использовать все доступное пространство в режиме разделения экрана, избегая черных полос.
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды 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
Отключает переопределение минимального соотношения сторон в полноэкранном режиме, чтобы использовать все доступное пространство экрана.
Как приложения могут достичь того же результата, что и переопределение
Подробнее о переопределении минимального соотношения сторон…
Как оптимизировать приложения
Подробнее о переопределении минимального соотношения сторон…
Как отключить переопределение
Подробнее о переопределении минимального соотношения сторон…
Флаги ресурса для настройки переопределения
Подробнее о переопределении минимального соотношения сторон…
Команды adb для тестирования переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Чтобы отменить переопределение:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Примечание. Команды временно применяют или отменяют переопределение.
OVERRIDE_ANY_ORIENTATION
Позволяет переопределять ориентацию экрана с помощью следующих параметров:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Как приложения могут достичь того же результата, что и переопределение
Задайте атрибут манифеста activity:screenOrientation или используйте API Activity#setRequestedOrientation().
Как оптимизировать приложения
Приложение должно поддерживать все ориентации. Изменение ориентации экрана – это изменение конфигурации, которое можно обработать двумя способами: позволить системе уничтожить и воссоздать приложение или самостоятельно управлять изменениями конфигурации. Если вы управляете изменениями конфигурации самостоятельно, состояние приложения можно сохранить с помощью ViewModel. В очень редких случаях можно заблокировать ориентацию только на небольших экранах, но это может быть не так удобно, как возможность поворачивать приложение по мере необходимости. В Android 12L и более поздних версиях фиксированную ориентацию можно переопределить конфигурацией устройства. Подробнее о том, как обрабатывать изменения конфигурации и поддерживать все ориентации, можно узнать в статьях Как обрабатывать изменения конфигурации, Обзор ViewModel и Ограничение ориентации приложения на телефонах, но не на устройствах с большим экраном.
Как отключить переопределение
Задайте для флага свойства PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE значение false.
Флаги ресурса для настройки переопределения
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Команды adb для тестирования переопределения
Чтобы применить переопределение:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
Чтобы отменить переопределение:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Примечание. Команды временно применяют или отменяют переопределение.
OVERRIDE_ANY_ORIENTATION_TO_USER
Позволяет приложению занимать все доступное пространство на экране. Переопределяет любые ограничения на ориентацию, изменение размера и соотношение сторон, указанные в манифесте приложения. Также игнорируются все вызовы Activity#setRequestedOrientation() или 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
Включает ориентацию 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
Включает правило совместимости, которое пропускает обновление ориентации приложения в ответ на вызов приложением функции 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
Запрещает применять к пакетам песочницу API Display для действий в режиме совместимости с размером или с черными полосами по краям. 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
Принудительное применение песочницы API Display к пакетам независимо от режима окон. API Display всегда предоставляют границы приложения.
Как приложения могут достичь того же результата, что и переопределение
Чтобы объявить действия не изменяющими размер, задайте для атрибута android:resizeableActivity значение false или для флага метаданных android.supports_size_changes значение false.
Как оптимизировать приложения
Приложения, которые можно изменять, не должны использовать размер экрана для позиционирования элементов интерфейса. Перенесите приложение с устаревших 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_SIMULATE_REQUESTED_ORIENTATION
Отключает имитацию обработки запрошенной ориентации для камеры. Улучшает работу некоторых приложений.
Как приложения могут достичь того же результата, что и переопределение
Установите для флага свойства PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION значение false.
Как оптимизировать приложения
Не полагайтесь на кешированные данные об ориентации датчика камеры или устройства. Информацию о совместимости камер можно найти в статьях Представляем видоискатель камеры и Поддержка изменяемых поверхностей в приложении камеры.
Как отключить переопределение
Поскольку это свойство отключает обработку совместимости, вы можете улучшить взаимодействие с пользователем, учитывая динамические изменения ориентации экрана, ориентацию устройства по датчику, а также размер окна и предварительного просмотра.
Флаги ресурса для настройки переопределения
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION"
android:value="true|false"/>
Команды adb для тестирования переопределения
Чтобы применить переопределение, которое удаляет имитацию запрошенной ориентации:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>
Чтобы удалить переопределение, которое позволяет имитировать запрошенную ориентацию:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <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 установлен флажок Изменяемое окно.
Как отключить переопределение
Задайте для флага свойства 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
Если переопределение включено, действие получает конфигурацию, которая включает вставки строки заголовка. Обычно в конфигурацию не включаются вставки панели субтитров.
Как приложения могут достичь того же результата, что и переопределение
Включить отображение от края до края. Ознакомьтесь со следующими материалами:
- Compose: вставки в окнах
- Просмотры: показ контента без полей
- Конфигурация: Изменения в поведении: приложения для Android 15 и более поздних версий
Как оптимизировать приложения
Чтобы избежать этой проблемы, включите в приложении полноэкранный режим.
Как отключить переопределение
Задайте для флага свойства PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS значение false.
Флаги ресурса для настройки переопределения
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS"
android:value="true|false"/>
Команды 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>
Примечание. Команды временно применяют или отменяют переопределение.
Дополнительные ресурсы
- Рекомендации по обеспечению качества адаптивных приложений
- Рекомендации по обеспечению качества основных приложений
-
Владелец виртуального устройства – это доверенное или привилегированное приложение, которое управляет виртуальным устройством. Владельцы виртуальных устройств создают их, чтобы запускать приложения и транслировать их на удаленные устройства, например персональные компьютеры, устройства виртуальной реальности или мультимедийные системы автомобилей. Владелец виртуального устройства использует локальное устройство, например телефон. ↩