Android 11 представляет замечательные новые функции и API для разработчиков. Разделы ниже помогут вам узнать о функциях для ваших приложений и начать работу с соответствующими API.
Подробный список новых, измененных и удаленных API см. в отчете API diff . Подробную информацию о новых 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, если вы хотели, чтобы уведомление всплывало, вам нужно было явно указать, что уведомление настроено на постоянный запуск в режиме документа UI. Начиная с Android 11, вам больше не нужно явно задавать эту настройку; если уведомление всплывает, платформа автоматически устанавливает для уведомления постоянный запуск в режиме документа UI.
Есть ряд улучшений в производительности пузырей, и пользователи имеют больше гибкости в включении и отключении пузырей из каждого приложения. Для разработчиков, которые реализовали экспериментальную поддержку, есть несколько изменений в API в Android 11:
- Конструктор
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 позволяет кэшировать эти большие наборы данных на устройстве с помощью общих BLOB-объектов данных . Чтобы узнать больше о совместном использовании наборов данных, см. подробное руководство по совместному использованию больших наборов данных .
Выполнять шифрование файлов после перезапуска OTA без учетных данных пользователя
После того, как устройство завершит обновление OTA и перезагрузится, зашифрованные ключи Credential Encrypted (CE), которые помещены в защищенное хранилище учетных данных, немедленно станут доступны для операций File-Based Encryption (FBE) . Это означает, что после обновления OTA ваше приложение может возобновить операции, требующие ключей CE, до того, как пользователь введет свой PIN-код, графический ключ или пароль.
Производительность и качество
Беспроводная отладка
Android 11 поддерживает беспроводное развертывание и отладку вашего приложения с рабочей станции через Android Debug Bridge (adb). Например, вы можете развернуть отлаживаемое приложение на нескольких удаленных устройствах без физического подключения устройства через USB и решения распространенных проблем с подключением USB, таких как установка драйвера. Для получения дополнительной информации см. Запуск приложений на аппаратном устройстве .
Инкрементная установка APK ADB
Установка больших (2 ГБ+) APK на устройство может занять много времени, даже если в приложение внесено лишь небольшое изменение. Инкрементная установка APK ADB (Android Debug Bridge) ускоряет этот процесс, устанавливая достаточно APK для запуска приложения при потоковой передаче оставшихся данных в фоновом режиме. adb install
будет использовать эту функцию автоматически, если она поддерживается устройством и у вас установлена последняя версия SDK Platform-Tools . Если она не поддерживается, используется метод установки по умолчанию в фоновом режиме.
Используйте следующую команду adb для использования этой функции. Если устройство не поддерживает инкрементную установку, команда не выполняется и выводит подробное объяснение.
adb install --incremental
Перед запуском инкрементальной установки APK ADB необходимо подписать APK и создать файл схемы подписи APK v4 . Файл подписи v4 должен быть помещен рядом с APK, чтобы эта функция работала.
Обнаружение ошибок с использованием собственного распределителя памяти
GWP-ASan — это встроенная функция выделения памяти, которая помогает находить ошибки use-after-free и heap-buffer-overflow. Вы можете включить эту функцию глобально или для определенных подпроцессов вашего приложения. Чтобы узнать больше, см. руководство GWP-Asan .
API нейронных сетей 1.3
Android 11 расширяет и улучшает API нейронных сетей (NNAPI) .
Новые операции
В NNAPI 1.3 представлен новый тип операнда TENSOR_QUANT8_ASYMM_SIGNED
для поддержки новой схемы квантования TensorFlow Lite .
Кроме того, NNAPI 1.3 вводит следующие новые операции:
-
QUANTIZED_LSTM
-
IF
-
WHILE
-
ELU
-
HARD_SWISH
-
FILL
-
RANK
Новые элементы управления ML
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()
Чтобы узнать больше, ознакомьтесь с примером домена памяти нейронной сети .
-
Поддержка API зависимостей и sync fence: NNAPI 1.3 включает поддержку асинхронных вычислений с зависимостями, что позволяет значительно сократить накладные расходы при вызове небольших цепочечных моделей. Эта функция добавляет следующие новые функции:
Поток управления: NNAPI 1.3 включает поддержку общего потока управления с новыми графовыми операциями
ANEURALNETWORKS_IF
иANEURALNETWORKS_WHILE
, которые принимают другие модели в качестве аргументов с использованием нового типа операндаANEURALNETWORKS_MODEL
. Кроме того, эта функция добавляет следующие новые функции:
Термический API NDK
Когда устройства перегреваются, они могут замедлить работу ЦП и/или ГП, и это может повлиять на приложения неожиданным образом. Приложения или игры, которые включают сложную графику, тяжелые вычисления или постоянную сетевую активность, с большей вероятностью столкнутся с проблемами.
Используйте 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())
. Вы можете проверить, виден ли в данный момент IME, вызвав view.getRootWindowInsets(). isVisible(Type.ime())
.
Чтобы синхронизировать представления вашего приложения с появлением и исчезновением IME, установите прослушиватель на представление, предоставив WindowInsetsAnimation.Callback
для View.setWindowInsetsAnimationCallback()
. (Вы можете установить этот прослушиватель на любое представление, это не обязательно должен быть EditText
.) IME вызывает метод onPrepare()
вашего прослушивателя, затем он вызывает onStart()
в начале перехода. Затем он вызывает onProgress()
на каждом этапе перехода. Когда переход завершен, IME вызывает onEnd()
. В любой точке перехода вы можете узнать, насколько продвинулся переход, вызвав WindowInsetsAnimation.getFraction()
.
Пример использования этих API см. в новом примере кода WindowInsetsAnimation .
Управление анимацией IME
Вы также можете взять под контроль анимацию IME или анимацию другой системной панели, например панели навигации. Для этого сначала вызовите setOnApplyWindowInsetsListener()
чтобы установить новый слушатель для изменений вставки окна:
Котлин
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 }
Ява
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()
контроллера:
Котлин
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 */) } } );
Ява
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() {} });
Обновления библиотек отделения интенсивной терапии
Android 11 обновляет пакет android.icu
для использования версии 66 библиотеки ICU по сравнению с версией 63 в Android 10. Новая версия библиотеки включает обновленные данные локали CLDR и ряд улучшений поддержки интернационализации в Android.
К заметным изменениям в новых версиях библиотеки относятся следующие:
- Многие API форматирования теперь поддерживают новый тип возвращаемого объекта, который расширяет
FormattedValue
. - API
LocaleMatcher
улучшен за счет класса-конструктора, поддержки типаjava.util.Locale
и класса результата, содержащего дополнительные данные о совпадении. - Теперь поддерживается Unicode 13.
СМИ
Выделение буферов MediaCodec
Android 11 включает в себя новый API MediaCodec
, который дает приложениям больше контроля при выделении входных и выходных буферов. Это позволяет вашему приложению эффективнее управлять памятью.
Новые классы:
Новые методы:
-
MediaCodec.getQueueRequest()
-
MediaCodec.getOutputFrame()
-
MediaCodec.LinearBlock.isCodecCopyFreeCompatible()
Кроме того, изменилось поведение двух методов в MediaCodec.Callback()
:
-
onInputBufferAvailable()
- Вместо вызова
MediaCodec.getInputBuffer()
иMediaCodec.queueInputBuffer()
с индексом, если настроено использование API блочной модели, приложения должны использовать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()
.
Новая функция AAudio AAudioStream_release()
Функция AAudioStream_close()
одновременно освобождает и закрывает аудиопоток. Это может быть опасно. Если другой процесс попытается получить доступ к потоку после того, как он был закрыт, процесс завершится сбоем.
Новая функция AAudioStream_release()
освобождает поток, но не закрывает его. Это освобождает его ресурсы и оставляет поток в известном состоянии. Объект сохраняется до тех пор, пока вы не вызовете AAudioStream_close()
.
API-интерфейс MediaParser
MediaParser — это новый API низкого уровня для извлечения медиа. Он более гибкий, чем MediaExtractor , и обеспечивает дополнительный контроль над функциональностью извлечения медиа.
Захват звука с USB-устройства
Когда приложение без разрешения RECORD_AUDIO
использует UsbManager
для запроса прямого доступа к USB-аудиоустройству с возможностью захвата звука (например, USB-гарнитуре), появляется новое предупреждающее сообщение с просьбой к пользователю подтвердить разрешение на использование устройства. Система игнорирует любую опцию «всегда использовать», поэтому пользователь должен подтвердить предупреждение и предоставить разрешение каждый раз, когда приложение запрашивает доступ.
Чтобы избежать такого поведения, ваше приложение должно запросить разрешение RECORD_AUDIO
.
Одновременный доступ к микрофону
Android 11 добавляет новые методы в API AudioRecord
, MediaRecorder
и AAudioStream
. Эти методы включают и отключают возможность захвата одновременно независимо от выбранного варианта использования. См. Sharing Audio Input .
Выходной коммутатор
В Android 11 реализовано новое поведение приложений, использующих API cast и mediarouter.
Помимо доступа к параметрам трансляции из приложения, параметры переключения также отображаются в системном медиаплеере. Это помогает пользователю плавно перемещаться между устройствами, когда он меняет контексты просмотра и прослушивания, например, смотрит видео на кухне или на телефоне или слушает аудио дома или в машине. См. переключатель выходов .
Связность
Улучшения Wi-Fi Passpoint
Информацию о возможностях Passpoint, добавленных в Android 11, см. в разделе Passpoint .
API предложений Wi-Fi расширен
Android 11 расширяет API предложений Wi-Fi , чтобы расширить возможности управления сетью вашего приложения, включая следующее:
- Приложения для управления подключением могут управлять собственными сетями, разрешая запросы на отключение.
- Сети точек доступа интегрированы в Suggestion API и могут быть предложены пользователю.
- Аналитические API позволяют вам получать информацию о качестве ваших сетей.
Обновления службы CallScreening
Начиная с 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-сети работают на уровне операционной системы, что упрощает код, необходимый для установления VPN-подключений IKEv2/IPsec в приложении.
Контроль доступа к сети на уровне процессов
Информацию о включении сетевого доступа для каждого процесса см. в разделе Управление использованием сети .
Разрешить установку нескольких конфигураций Passpoint с одним и тем же полным доменным именем
Начиная с Android 11, вы можете использовать PasspointConfiguration.getUniqueId()
для получения уникального идентификатора для объекта PasspointConfiguration
, что позволяет пользователям вашего приложения устанавливать несколько профилей с одним и тем же полным доменным именем (FQDN).
Эта функция полезна, когда оператор использует в своей сети более одной комбинации кода страны (MCC) и кода сети (MNC), но имеет только одно полное доменное имя (FQDN). На Android 11 и выше можно установить более одного профиля с тем же полным доменным именем (FQDN), который будет соответствовать сети домашнего провайдера, когда пользователь устанавливает SIM-карту с MCC или MNC.
Поддержка антенны GNSS
В Android 11 представлен класс GnssAntennaInfo
, который позволяет вашему приложению эффективнее использовать позиционирование с точностью до сантиметра, предоставляемое Глобальной навигационной спутниковой системой (GNSS).
Более подробную информацию можно найти в руководстве по калибровке антенн .
Графика
Декодер изображений NDK
API NDK ImageDecoder
предоставляет стандартный 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()
. - Чтобы запросить, чтобы события касания обходили системный сенсорный проводник, вызовите
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 v4
В Android 11 добавлена поддержка схемы подписи APK v4 . Эта схема создает новый тип подписи в отдельном файле ( apk-name .apk.idsig
), но в остальном похожа на v2 и v3. В APK не вносятся никакие изменения. Эта схема поддерживает инкрементальную установку APK ADB , что ускоряет установку APK.
Динамические фильтры намерений
Чтобы получать намерения, приложение должно объявить во время компиляции, какие типы данных оно может получать, определив фильтр намерений в манифесте приложения. В Android 10 и ниже приложения не имеют возможности изменять свои фильтры намерений во время выполнения. Это проблема для приложений виртуализации (таких как виртуальные машины и удаленные рабочие столы), поскольку они не могут точно знать, какое программное обеспечение пользователь установит внутри них.
Android 11 представляет MIME-группы, новый элемент манифеста, который позволяет приложению объявлять динамический набор типов MIME в фильтре намерений и изменять его программно во время выполнения. Чтобы использовать группу MIME, включите элемент данных в манифест приложения с новым атрибутом 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 и обновить его, передав ее идентификатор следующим новым методам в классе API PackageManager
:
Когда вы добавляете тип MIME в группу 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 теперь могут отображать предложения автозаполнения в строке, в полосе предложений или аналогичном интерфейсе, а не в раскрывающемся меню. Для защиты конфиденциальной информации, такой как пароли и номера кредитных карт, предложения отображаются для пользователя, но не известны IME, пока пользователь не выберет один из них. Для получения информации о том, как IME и менеджеры паролей могут поддерживать эту функцию, см. Интеграция автозаполнения с клавиатурами .
Обмен данными со службой захвата контента
Начиная с Android 11, ваше приложение может обмениваться данными со службой захвата контента устройства. Эта возможность упрощает для устройства предоставление контекстной информации, например, отображение названия песни, которая в данный момент воспроизводится в среде пользователя.
Чтобы сделать данные из вашего приложения доступными для службы захвата контента, вызовите метод shareData()
на экземпляре ContentCaptureManager
. Если система принимает запрос на обмен данными, ваше приложение получает дескриптор файла только для записи для обмена со службой захвата контента.