В Android 11 появились новые функции и API для разработчиков. В разделах ниже вы найдете информацию о функциях для приложений и о том, как начать работу с соответствующими API.
Подробный список новых, измененных и удаленных API можно найти в отчете о различиях API. Подробную информацию о новых API можно найти в документации по Android API. Новые API выделены для удобства. Чтобы узнать, как изменения платформы могут повлиять на ваши приложения, ознакомьтесь с изменениями в поведении Android 11 для приложений, предназначенных для Android R, и для всех приложений, а также с изменениями в отношении конфиденциальности.
Новые возможности
Управление устройствами
В Android 11 появился новый API ControlsProviderService, который позволяет показывать элементы управления подключенными внешними устройствами. Они появятся в разделе Управление устройствами в меню кнопки питания Android. Подробнее о том, как управлять внешними устройствами…
Элементы управления медиаконтентом
В Android 11 изменился способ отображения элементов управления мультимедиа. Элементы управления мультимедиа находятся рядом с быстрыми настройками. Сеансы из нескольких приложений упорядочены в карусели, которую можно пролистывать. В ней представлены потоки, воспроизводимые локально на телефоне, удаленные потоки, например обнаруженные на внешних устройствах или сеансы трансляции, а также предыдущие сеансы, которые можно возобновить, в порядке их последнего воспроизведения.
Пользователи могут перезапустить предыдущие сеансы из карусели, не запуская приложение. Когда воспроизведение начинается, пользователь взаимодействует с элементами управления мультимедиа обычным способом.
Подробнее об элементах управления мультимедиа…
Экраны
Улучшенная поддержка каскадных экранов
В Android 11 есть несколько API для поддержки экранов-водопадов, которые заходят на боковые грани устройства. Такие экраны считаются разновидностью экранов с вырезами. Существующие методы DisplayCutout.getSafeInset…() теперь возвращают безопасную область, которая не включает вырезы и закругленные края.
Чтобы контент приложения отображался в области выреза, выполните следующие действия:
Вызовите
DisplayCutout.getWaterfallInsets(), чтобы получить точные размеры выреза.Задайте для атрибута макета окна
layoutInDisplayCutoutModeзначениеLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS, чтобы окно могло расширяться в области выреза и водопада по всем краям экрана. Убедитесь, что в этих областях нет важного контента.
Датчик угла раскрытия и складные устройства
В Android 11 приложения, запущенные на устройствах с шарнирными экранами, могут определять угол шарнира с помощью нового датчика TYPE_HINGE_ANGLE и нового класса SensorEvent, который отслеживает угол шарнира и измеряет в градусах угол между двумя составными частями устройства. Эти необработанные измерения можно использовать для выполнения детализированной анимации, когда пользователь манипулирует устройством.
Подробнее о складных устройствах…
Разговоры
Улучшения в чатах
В Android 11 улучшена работа с чатами. Разговоры – это двустороннее общение в реальном времени между двумя или более людьми. Такие чаты выделяются, и у пользователей есть несколько новых вариантов взаимодействия с ними.
Подробнее о чатах и их поддержке в приложении…
Всплывающие чаты
Теперь разработчики могут использовать всплывающие чаты, чтобы пользователям было проще находить чаты в системе. В Android 10 всплывающие чаты были экспериментальной функцией, которую можно было включить в настройках для разработчиков. В Android 11 это больше не требуется.
Если приложение предназначено для Android 11 (уровня API 30) или более поздней версии, его уведомления не будут показываться в виде всплывающих чатов, если они не соответствуют новым требованиям к чатам. В частности, уведомление должно быть связано с ярлыком.
До Android 11, чтобы уведомление отображалось во всплывающем окне, нужно было явно указать, что оно должно всегда запускаться в режиме интерфейса документа. Начиная с Android 11, вам больше не нужно явно задавать эту настройку. Если уведомление отображается в виде всплывающего чата, платформа автоматически настраивает его так, чтобы оно всегда запускалось в режиме пользовательского интерфейса документа.
В Android 11 мы улучшили производительность всплывающих уведомлений и добавили возможность включать и отключать их для каждого приложения. Если вы уже реализовали экспериментальную поддержку этой функции, обратите внимание на следующие изменения в API:
- Конструктор
BubbleMetadata.Builder()без параметров больше не поддерживается. Вместо него необходимо использовать один из двух новых конструкторов:BubbleMetadata.Builder(PendingIntent, Icon)илиBubbleMetadata.Builder(String). - Создайте
BubbleMetadataиз идентификатора ярлыка, вызвавBubbleMetadata.Builder(String). Переданная строка должна соответствовать идентификатору ярлыка, указанному вNotification.Builder. - Создавайте значки-пузыри с помощью
Icon.createWithContentUri()или нового методаcreateWithAdaptiveBitmapContentUri().
Визуальные индикаторы 5G
Информацию о том, как показывать индикаторы 5G на устройствах пользователей, можно найти в статье Как сообщить пользователям, что они подключены к сети 5G.
Конфиденциальность
В Android 11 появилось множество изменений и ограничений, направленных на повышение конфиденциальности пользователей. Подробную информацию вы найдете на странице Конфиденциальность.
Безопасность
Обновления биометрической аутентификации
Чтобы вы могли контролировать уровень безопасности данных приложения, в Android 11 улучшена биометрическая аутентификация. Эти изменения также отражены в библиотеке Jetpack Biometric.
Типы аутентификации
В Android 11 появился интерфейс BiometricManager.Authenticators, который позволяет указать типы аутентификации, поддерживаемые вашим приложением.
Как определить, какой тип аутентификации использовался
После аутентификации пользователя вы можете проверить, использовались ли учетные данные устройства или биометрические данные, вызвав метод getAuthenticationType().
Дополнительная поддержка ключей, требующих аутентификации при каждом использовании
В Android 11 расширена поддержка аутентификации с помощью одноразовых ключей.
Устаревшие методы
В Android 11 прекращена поддержка следующих методов:
- Метод
setDeviceCredentialAllowed(). - Метод
setUserAuthenticationValidityDurationSeconds(). - Перегруженная версия
canAuthenticate(), которая не принимает аргументов.
Безопасный обмен большими наборами данных
В некоторых ситуациях, например при использовании машинного обучения или воспроизведении медиаконтента, вашему приложению может потребоваться тот же большой набор данных, что и другому приложению. В предыдущих версиях Android каждому приложению приходилось скачивать отдельную копию одного и того же набора данных.
Чтобы уменьшить избыточность данных в сети и на диске, в Android 11 можно кешировать большие наборы данных на устройстве с помощью общих больших двоичных объектов. Подробнее о том, как делиться наборами данных, читайте в подробном руководстве по обмену большими наборами данных.
Шифрование на уровне файлов после перезапуска OTA без учетных данных пользователя
После того как устройство завершит беспроводное обновление и перезапустится, ключи CE, помещенные в хранилище, защищенное учетными данными, сразу же станут доступны для операций шифрования на уровне файлов (FBE). Это означает, что после беспроводного обновления приложение может возобновить операции, для которых требуются ключи CE, до того, как пользователь введет PIN-код, графический ключ или пароль.
Производительность и качество
Отладка по Wi-Fi
В Android 11 поддерживается беспроводное развертывание и отладка приложения с рабочей станции через Android Debug Bridge (adb). Например, вы можете развернуть отладочное приложение на нескольких удаленных устройствах без физического подключения через USB и связанных с этим проблем, таких как установка драйверов. Подробнее о том, как запускать приложения на аппаратном устройстве…
Постепенная установка APK-файлов с помощью ADB
Установка больших APK-файлов (от 2 ГБ) на устройство может занять много времени, даже если в приложение внесено лишь небольшое изменение. Пошаговая установка APK-файлов с помощью ADB (Android Debug Bridge) ускоряет этот процесс, устанавливая только ту часть APK-файла, которая необходима для запуска приложения, а остальные данные передаются в фоновом режиме. adb install будет использовать эту функцию автоматически, если она поддерживается устройством и у вас установлена последняя версия SDK Platform-Tools. Если он не поддерживается, по умолчанию используется способ установки без уведомления.
Чтобы использовать эту функцию, введите следующую команду adb: Если устройство не поддерживает инкрементную установку, команда не выполняется и выводится подробное объяснение.
adb install --incremental
Перед установкой APK с помощью ADB необходимо подписать APK и создать файл схемы подписи APK версии 4. Чтобы эта функция работала, файл подписи версии 4 должен находиться рядом с APK.
Обнаружение ошибок с помощью нативного распределителя памяти
GWP-ASan – это функция распределения нативной памяти, которая помогает находить ошибки типа Use-After-Free и Heap-Buffer-Overflow. Эту функцию можно включить глобально или для определенных подпроцессов приложения. Подробнее о GWP-Asan…
Neural Networks API 1.3
В Android 11 расширен и улучшен Neural Networks API (NNAPI).
Новые операции
В NNAPI 1.3 добавлен новый тип операнда TENSOR_QUANT8_ASYMM_SIGNED, который поддерживает новую схему квантования TensorFlow Lite.
Кроме того, в NNAPI 1.3 появились следующие новые операции:
QUANTIZED_LSTMIFWHILEELUHARD_SWISHFILLRANK
Новые элементы управления машинным обучением
В NNAPI 1.3 добавлены новые элементы управления, которые помогают обеспечить бесперебойную работу машинного обучения:
QoS API. Новый API качества обслуживания поддерживает приоритеты и сроки выполнения задач в NNAPI. В него добавлены следующие функции:
Ввод и вывод доменов памяти. NNAPI 1.3 поддерживает домены памяти в качестве входных и выходных данных для выполнения. Это позволяет избежать ненужного копирования одних и тех же данных между разными компонентами системы и повысить производительность нейросетей Android во время выполнения. Эта функция добавляет набор новых API NDK для использования с объектами
ANeuralNetworksMemoryDescиANeuralNetworkMemory, включая следующие функции:ANeuralNetworksMemoryDesc_create()ANeuralNetworksMemoryDesc_free()ANeuralNetworksMemoryDesc_addInputRole()ANeuralNetworksMemoryDesc_addOutputRole()ANeuralNetworksMemoryDesc_setDimensions()ANeuralNetworksMemoryDesc_finish()ANeuralNetworksMemory_createFromDesc()ANeuralNetworksMemory_copy()
Подробнее об этом рассказывается в примере домена памяти нейронной сети.
Поддержка Dependency API и барьеров синхронизации. В NNAPI 1.3 добавлена поддержка асинхронных вычислений с зависимостями, что позволяет значительно снизить нагрузку при вызове небольших связанных моделей. Эта функция добавляет следующие новые функции:
Управление потоком. В NNAPI 1.3 добавлена поддержка общего управления потоком с помощью новых операций графа
ANEURALNETWORKS_IFиANEURALNETWORKS_WHILE, которые принимают другие модели в качестве аргументов, используя новый тип операндаANEURALNETWORKS_MODEL. Кроме того, эта функция добавляет следующие новые функции:
NDK Thermal API
При перегреве устройства могут снижать производительность ЦП и/или графического процессора, что может неожиданным образом повлиять на работу приложений. Проблемы чаще возникают в приложениях и играх со сложной графикой, тяжелыми вычислениями или постоянной сетевой активностью.
Используйте NDK Thermal API в Android 11, чтобы отслеживать изменения температуры устройства и принимать меры для снижения энергопотребления и охлаждения устройства. Этот API похож на Java Thermal API. С его помощью можно получать уведомления об изменении температурного статуса или напрямую запрашивать текущий статус.
Текст и ввод
Улучшенные переходы IME
В Android 11 появились новые API, которые улучшают переходы для редакторов методов ввода (IME), например экранных клавиатур. Эти API упрощают настройку контента приложения в соответствии с появлением и исчезновением IME и другими элементами, такими как строка состояния и панель навигации.
Чтобы показать IME, когда фокус находится на любом элементе EditText, вызовите view.getInsetsController().show(Type.ime()).
(Этот метод можно вызвать для любого представления в той же иерархии, что и выбранный элемент EditText, а не только для самого элемента EditText.) Чтобы скрыть IME, вызовите
view.getInsetsController().hide(Type.ime()).
Проверить, виден ли редактор метода ввода, можно с помощью метода view.getRootWindowInsets().isVisible(Type.ime()).
Чтобы синхронизировать представления приложения с появлением и исчезновением IME, установите прослушиватель в представлении, передав WindowInsetsAnimation.Callback в View.setWindowInsetsAnimationCallback().
Прослушиватель можно настроить для любого представления, не только для EditText.
Редактор методов ввода вызывает метод onPrepare() прослушивателя, а затем – метод onStart() в начале перехода. Затем он вызывает onProgress() на каждом этапе перехода. Когда переход завершится, IME вызовет onEnd().
Вы можете в любой момент узнать, как продвигается переход, вызвав метод WindowInsetsAnimation.getFraction().
Пример использования этих API можно найти в новом примере кода WindowInsetsAnimation.
Управление анимацией IME
Вы также можете управлять анимацией IME или другой системной строки, например панели навигации. Для этого сначала вызовите setOnApplyWindowInsetsListener(), чтобы задать новый прослушиватель для изменений вставки окна:
Kotlin
rootView.setOnApplyWindowInsetsListener { rootView, windowInsets -> val barsIme = windowInsets.getInsets(Type.systemBars() or Type.ime()) rootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom) // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. WindowInsets.CONSUMED }
Java
mRoot.setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { Insets barsIME = insets.getInsets(Type.systemBars() | Type.ime()); mRootView.setPadding(barsIme.left, barsIme.top, barsIme.right, barsIme.bottom); // We return the new WindowInsets.CONSUMED to stop the insets being // dispatched any further into the view hierarchy. This replaces the // deprecated WindowInsets.consumeSystemWindowInsets() and related // functions. return WindowInsets.CONSUMED; } });
Чтобы переместить IME или другую системную строку, вызовите метод controlWindowInsetsAnimation() контроллера:
Kotlin
view.windowInsetsController.controlWindowInsetsAnimation( Type.ime(), 1000, LinearInterpolator(), cancellationSignal, object : WindowInsetsAnimationControlListener() { fun onReady(controller: WindowInsetsAnimationController, types: Int) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */) } } );
Java
mRoot.getWindowInsetsController().controlWindowInsetsAnimation( Type.ime(), 1000, new LinearInterpolator(), cancellationSignal, new WindowInsetsAnimationControlListener() { @Override public void onReady( @NonNull WindowInsetsAnimationController controller, int types ) { // update IME inset controller.setInsetsAndAlpha(Insets.of(0, 0, 0, inset), 1f /* alpha */, 0.1 /* fraction progress */); } @Override public void onCancelled() {} });
Обновление библиотек ICU
В Android 11 пакет android.icu обновлен до версии 66 библиотеки ICU (в Android 10 использовалась версия 63). В новой версии библиотеки обновлены данные CLDR для региональных настроек и улучшена поддержка интернационализации в Android.
Основные изменения в новых версиях библиотек:
- Многие API форматирования теперь поддерживают новый тип возвращаемого объекта, который расширяет
FormattedValue. - В API
LocaleMatcherдобавлен класс builder, поддержка типаjava.util.Localeи класс result с дополнительными данными о совпадении. - Добавлена поддержка Unicode 13.
Мультимедиа
Выделение буферов MediaCodec
В Android 11 добавлены новые API MediaCodec, которые позволяют приложениям лучше контролировать распределение буферов ввода и вывода. Это позволяет приложению более эффективно управлять памятью.
Новые классы:
Новые методы:
MediaCodec.getQueueRequest()MediaCodec.getOutputFrame()MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Кроме того, изменилось поведение двух методов в MediaCodec.Callback():
onInputBufferAvailable()- Если приложение настроено на использование Block Model API, то вместо вызова
MediaCodec.getInputBuffer()иMediaCodec.queueInputBuffer()с индексом оно должно использоватьMediaCodec.getQueueRequestс индексом, прикрепляя LinearBlock/HardwareBuffer к слоту. onOutputBufferAvailable()- Вместо вызова
MediaCodec.getOutputBuffer()с индексом приложения могут использоватьMediaCodec.getOutputFrame()с индексом, чтобы получить объектOutputFrameс дополнительной информацией и буферами LinearBlock/HardwareBuffer.
Декодирование с низкой задержкой в MediaCodec
В Android 11 улучшен класс MediaCodec, чтобы поддерживать декодирование с низкой задержкой для игр и других приложений, работающих в реальном времени. Чтобы проверить, поддерживает ли кодек декодирование с низкой задержкой, передайте FEATURE_LowLatency в MediaCodecInfo.CodecCapabilities.isFeatureSupported().
Чтобы включить или отключить декодирование с низкой задержкой, выполните одно из следующих действий:
- Задайте для нового ключа
KEY_LOW_LATENCYзначение 0 или 1 с помощьюMediaCodec.configure(). - Задайте для нового ключа параметра
PARAMETER_KEY_LOW_LATENCYзначение 0 или 1 с помощьюMediaCodec.setParameters().
Новая функция AAudioStream_release() в AAudio
Функция AAudioStream_close() одновременно освобождает и закрывает аудиопоток. Это может быть опасно. Если другой процесс попытается получить доступ к потоку после его закрытия, произойдет сбой.
Новая функция AAudioStream_release() освобождает поток, но не закрывает его. Это освобождает ресурсы и оставляет поток в известном состоянии. Объект сохраняется до тех пор, пока вы не вызовете AAudioStream_close().
MediaParser API
MediaParser – это новый низкоуровневый API для извлечения медиаконтента. Он более гибкий, чем MediaExtractor, и предоставляет дополнительный контроль над функциями извлечения медиафайлов.
Запись аудио с USB-устройства
Если приложение без разрешения RECORD_AUDIO использует UsbManager, чтобы запросить прямой доступ к USB-аудиоустройству с возможностью записи звука (например, к USB-гарнитуре), появляется новое предупреждение с просьбой подтвердить разрешение на использование устройства. Система игнорирует параметр "Всегда использовать", поэтому пользователь должен подтверждать предупреждение и предоставлять разрешение каждый раз, когда приложение запрашивает доступ.
Чтобы избежать этого, приложение должно запрашивать разрешение RECORD_AUDIO.
Одновременный доступ к микрофону
В Android 11 добавлены новые методы для API AudioRecord, MediaRecorder и AAudioStream. Эти методы позволяют включить или отключить возможность параллельной съемки независимо от выбранного варианта использования. Подробнее о передаче аудиовхода…
Переключатель вывода
В Android 11 реализовано новое поведение для приложений, использующих API Cast и MediaRouter.
Помимо доступа к параметрам трансляции из приложения, параметры переключения также появляются в системном медиапроигрывателе. Это позволяет пользователю легко переключаться между устройствами в зависимости от того, где он находится и что делает, например смотрит видео на кухне или на телефоне, слушает музыку дома или в машине. Подробнее о переключателе вывода медиаданных…
Функции связи
Улучшения Wi-Fi Passpoint
Подробнее о возможностях Passpoint, добавленных в Android 11…
Расширен API Wi-Fi Suggestion
В Android 11 расширен Wi-Fi Suggestion API, что позволяет улучшить управление сетями в приложении. В частности, теперь можно:
- Приложения для управления подключением могут управлять своими сетями, разрешая запросы на отключение.
- Сети Passpoint интегрированы в Suggestion API и могут предлагаться пользователю.
- API аналитики позволяют получать информацию о качестве сетей.
Обновления CallScreeningService
Начиная с Android 11, CallScreeningService может запрашивать информацию о статусе проверки STIR/SHAKEN (verstat) для входящих вызовов. Эта информация предоставляется в составе сведений о входящих вызовах.
Если у CallScreeningService есть разрешение READ_CONTACTS, приложение получает уведомления о входящих и исходящих вызовах, связанных с номерами из списка контактов пользователя.
Подробнее о том, как предотвратить подмену номера вызывающего абонента…
Обновления Open Mobile API
Информацию о поддержке OMAPI в Android 11 и более поздних версиях можно найти в статье Поддержка считывателя Open Mobile API.
Высокопроизводительные VPN
Приложения, предназначенные для целевого уровня API 30 и выше или работающие на устройствах с уровнем API 29 и выше, могут применять IKEv2/IPsec к VPN, настроенным пользователем или приложениями.
VPN-подключения работают на уровне операционной системы, что упрощает код, необходимый для установки VPN-подключений IKEv2/IPsec в приложении.
Управление доступом к сети для отдельных процессов
Подробнее о том, как включить доступ к сети для отдельных процессов…
Разрешить несколько установленных конфигураций Passpoint с одним и тем же FQDN
Начиная с Android 11 вы можете использовать PasspointConfiguration.getUniqueId(), чтобы получить уникальный идентификатор для объекта PasspointConfiguration. Это позволит пользователям вашего приложения устанавливать несколько профилей с одним и тем же полным доменным именем (FQDN).
Эта функция полезна, когда оператор развертывает в своей сети несколько комбинаций кодов MCC и MNC, но имеет только одно полное доменное имя. На устройствах с Android 11 и более поздних версий можно установить несколько профилей с одинаковым полным доменным именем, которые будут соответствовать сети домашнего провайдера, когда пользователь установит SIM-карту с MCC или MNC.
Поддержка антенны GNSS
В Android 11 появился класс GnssAntennaInfo, который позволяет приложению использовать данные о местоположении с точностью до сантиметра, предоставляемые глобальной навигационной спутниковой системой (GNSS).
Подробнее о калибровке антенны…
Графика
Декодер изображений NDK
NDK ImageDecoder API предоставляет стандартный API для приложений Android C/C++, позволяющий декодировать изображения напрямую. Разработчикам приложений больше не нужно использовать API фреймворка (через JNI) или сторонние библиотеки декодирования изображений. Дополнительную информацию можно найти в руководстве для разработчиков по декодеру изображений.
API частоты кадров
В Android 11 есть API, который позволяет приложениям сообщать системе о желаемой частоте кадров. Это помогает уменьшить дрожание изображения на устройствах, поддерживающих несколько частот обновления. Инструкции по использованию этого API приведены в руководстве по частоте кадров.
Как запросить и проверить поддержку низкой задержки
Некоторые дисплеи, например внешние мониторы и телевизоры, могут выполнять постобработку графики. Это улучшает графику, но может увеличить задержку. Новые дисплеи с поддержкой HDMI 2.1 имеют автоматический режим низкой задержки (ALLM, также известный как игровой режим), который минимизирует задержку за счет отключения постобработки. Подробную информацию об ALLM можно найти в спецификации HDMI 2.1.
Окно может запрашивать использование автоматического режима низкой задержки, если он доступен. ALLM особенно полезен для игр и видеоконференций, где низкая задержка важнее, чем наилучшая графика.
Чтобы включить или отключить минимальную постобработку, вызовите Window.setPreferMinimalPostProcessing() или задайте для атрибута preferMinimalPostProcessing окна значение true. Минимальная постобработка поддерживается не на всех экранах. Чтобы узнать, доступна ли она на определенном экране, вызовите новый метод Display.isMinimalPostProcessingSupported().
Внедрение слоя отладки графики
Теперь приложения могут загружать внешние графические слои (GLES, Vulkan) в код нативного приложения, чтобы использовать те же функции, что и отладочное приложение, но без снижения производительности. Это особенно важно при профилировании приложения с помощью таких инструментов, как GAPID. Чтобы профилировать приложение, добавьте в его файл манифеста следующий элемент метаданных вместо того, чтобы делать приложение доступным для отладки:
<application ... > <meta-data android:name="com.android.graphics.injectLayers.enable" android:value="true" /> </application>
Изображения и камера
Отключать звуки и вибрацию уведомлений во время записи
Начиная с Android 11, когда приложение активно использует камеру, оно может отключать только вибрацию, звуки и вибрацию или ничего из этого с помощью setCameraAudioRestriction().
Расширенная поддержка камеры в эмуляторе Android
Подробнее о расширенной поддержке камер в эмуляторе, начиная с Android 11…
Поддержка одновременного использования нескольких камер.
В Android 11 добавлены API, позволяющие запрашивать поддержку одновременного использования нескольких камер, в том числе фронтальной и основной.
Чтобы проверить, поддерживается ли эта функция на устройстве, на котором запущено приложение, используйте следующие методы:
getConcurrentCameraIds()возвращаетSetкомбинаций идентификаторов камер, которые могут вести трансляцию одновременно с гарантированными комбинациями потоков при настройке одним и тем же процессом приложения.isConcurrentSessionConfigurationSupported()запрашивает, могут ли камеры одновременно поддерживать соответствующие конфигурации сеансов.
Улучшена поддержка изображений HEIF с несколькими кадрами.
Начиная с Android 11, если вы вызываете ImageDecoder.decodeDrawable() и передаете изображение HEIF, содержащее последовательность кадров (например, анимацию или фото из серии снимков), метод возвращает AnimatedImageDrawable, содержащий всю последовательность изображений. В более ранних версиях Android метод возвращал BitmapDrawable только одного кадра.
Если изображение HEIF содержит несколько кадров, которые не находятся в последовательности, вы можете получить отдельный кадр, вызвав MediaMetadataRetriever.getImageAtIndex().
Специальные возможности
Новости для разработчиков сервисов специальных возможностей
Если вы создаете специальную службу специальных возможностей, в Android 11 вы можете использовать следующие функции:
- Теперь в пользовательском объяснении сервиса специальных возможностей можно использовать не только обычный текст, но и HTML-код и изображения. Благодаря этому вам будет проще объяснить конечным пользователям, как работает ваш сервис и чем он может им помочь.
- Чтобы получить более осмысленное описание состояния элемента интерфейса, чем
contentDescription, вызовите методgetStateDescription(). - Чтобы события касания обходили системную функцию Touch Explorer, вызовите
setTouchExplorationPassthroughRegion(). Аналогично, чтобы жесты не обрабатывались системным детектором, вызовите методsetGestureDetectionPassthroughRegion(). - Вы можете запрашивать действия IME, например "Ввод" и "Далее", а также скриншоты окон, в которых не включен флаг
FLAG_SECURE.
Дополнительные функции
Причины завершения процессов приложения
В Android 11 появился метод ActivityManager.getHistoricalProcessExitReasons(), который сообщает причины недавних завершений процессов. Приложения могут использовать этот метод для сбора диагностической информации о сбоях, например о том, было ли завершение процесса вызвано ошибками ANR, проблемами с памятью или другими причинами.
Кроме того, вы можете использовать новый метод setProcessStateSummary(), чтобы сохранять информацию о состоянии для последующего анализа.
Метод getHistoricalProcessExitReasons() возвращает экземпляры класса ApplicationExitInfo, который содержит информацию о завершении процесса приложения. Вызвав getReason() для экземпляра этого класса, вы можете определить, почему процесс вашего приложения был завершен. Например, возвращаемое значение REASON_CRASH указывает на то, что в приложении возникло необработанное исключение. Если приложению необходимо обеспечить уникальность событий выхода, оно может поддерживать идентификатор, например значение хеша на основе временной метки из метода getTimestamp().
Дополнительные ресурсы
Подробную информацию вы найдете в статье о новых инструментах Android 11, которые помогают повысить конфиденциальность и стабильность приложений на сайте Medium.
Загрузчики ресурсов
В Android 11 появился новый API, который позволяет приложениям динамически расширять возможности поиска и загрузки ресурсов. Новые классы API ResourcesLoader и ResourcesProvider в основном отвечают за предоставление новых функций. Вместе они позволяют добавлять дополнительные ресурсы и объекты или изменять значения существующих.
Объекты ResourcesLoader – это контейнеры, которые предоставляют объекты ResourcesProvider экземпляру Resources приложения. В свою очередь, объекты ResourcesProvider предоставляют методы для загрузки данных ресурсов из APK-файлов и таблиц ресурсов.
Один из основных вариантов использования этого API – загрузка собственных объектов. С помощью loadFromDirectory() можно создать ResourcesProvider, который перенаправляет разрешение ресурсов и объектов на основе файлов, заставляя его искать определенный каталог, а не APK приложения. Доступ к этим объектам можно получить с помощью методов open() из класса API AssetManager, как и к объектам, упакованным в APK.
Схема подписи APK версии 4
В Android 11 добавлена поддержка схемы подписи APK версии 4. Она позволяет создавать новый тип подписи в отдельном файле (apk-name.apk.idsig), но в остальном похожа на версии 2 и 3. В APK-файл не вносятся изменения. Эта схема поддерживает постепенную установку APK-файлов с помощью ADB, что ускоряет установку APK.
Динамические фильтры интентов
Чтобы получать интенты, приложение должно во время компиляции объявить, какие типы данных оно может получать, определив фильтр интентов в манифесте приложения. В Android 10 и более ранних версиях приложения не могут менять фильтры намерений во время выполнения. Это проблема для приложений виртуализации (таких как виртуальные машины и удаленные рабочие столы), поскольку они не могут точно знать, какое программное обеспечение пользователь установит внутри них.
В Android 11 появились группы MIME – новый элемент манифеста, который позволяет приложению объявлять динамический набор MIME-типов в фильтре интентов и изменять его программно во время выполнения. Чтобы использовать группу MIME, добавьте в манифест приложения элемент data с новым атрибутом android:mimeGroup:
<intent-filter> <action android:name="android.intent.action.SEND"/> <category android:name="android.intent.category.DEFAULT"/> <data android:mimeGroup="myMimeGroup"/> </intent-filter>
Значение атрибута android:mimeGroup – это произвольный строковый идентификатор, который определяет группу MIME во время выполнения. Вы можете получить доступ к содержимому группы MIME и обновить его, передав идентификатор группы в следующие новые методы класса PackageManager API:
Когда вы программно добавляете MIME-тип в группу, он работает точно так же, как статический MIME-тип, явно объявленный в манифесте.
Улучшения автозаполнения
В Android 11 улучшены сервисы автозаполнения.
Идентификаторы подсказок в AssistStructure.ViewNode
Сервисам автозаполнения часто бывает полезно вычислить хеш подписи для представления на основе его свойств. Подсказка – это свойство, которое особенно хорошо подходит для включения в хеш подписи, но строка подсказки может меняться в зависимости от региональных настроек телефона. Чтобы решить эту проблему, в Android 11 в класс AssistStructure.ViewNode добавлен новый метод getHintIdEntry(), который возвращает идентификатор ресурса для текста подсказки в представлении. Этот метод возвращает значение, не зависящее от региональных настроек, которое можно использовать для вычисления хешей подписей.
События показа наборов данных
Чтобы помочь сервисам автозаполнения улучшить подсказки, в Android 11 предусмотрен способ выявления случаев, когда сервис автозаполнения предлагал наборы данных, но пользователь не выбрал ни один из них. В Android 11 FillEventHistory сообщает о новом типе события TYPE_DATASETS_SHOWN. FillEventHistory регистрирует событие этого типа каждый раз, когда сервис автозаполнения предлагает пользователю один или несколько наборов данных. Сервисы автозаполнения могут использовать эти события вместе с существующим событием TYPE_DATASET_SELECTED, чтобы определить, выбрал ли пользователь какой-либо из предложенных вариантов автозаполнения.
Интеграция IME
Теперь клавиатуры и другие редакторы методов ввода могут показывать подсказки автозаполнения в строке, на панели подсказок или в аналогичном интерфейсе, а не в раскрывающемся меню. Чтобы защитить конфиденциальную информацию, например пароли и номера кредитных карт, подсказки показываются пользователю, но не передаются в IME, пока пользователь не выберет одну из них. Подробнее о том, как редакторы методов ввода и менеджеры паролей могут поддерживать эту функцию…
Передача данных сервису записи контента
Начиная с Android 11 приложение может передавать данные сервису записи контента на устройстве. Благодаря этому устройству проще предоставлять контекстную информацию, например показывать название песни, которая сейчас играет.
Чтобы сделать данные из приложения доступными для сервиса записи контента, вызовите метод shareData() для экземпляра ContentCaptureManager. Если система принимает запрос на передачу данных, ваше приложение получает дескриптор файла, предназначенного только для записи, чтобы поделиться им с сервисом записи контента.