Обзор функций и API

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

Подробный список новых, измененных и удаленных API см. в отчете об изменениях API . Подробную информацию о новых API см. в справочнике API Android — новые 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 улучшена производительность всплывающих окон, и у пользователей появилась большая гибкость в их включении и отключении. Для разработчиков, реализовавших экспериментальную поддержку, в Android 11 внесены некоторые изменения в API:

Визуальные индикаторы 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-код, графический ключ или пароль.

Производительность и качество

Беспроводная отладка

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 версии 4. Для корректной работы этой функции файл подписи версии 4 должен быть размещен рядом с 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

Новые элементы управления машинным обучением

В NNAPI 1.3 представлены новые элементы управления, которые помогут обеспечить бесперебойную работу машинного обучения:

NDK Thermal API

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

Используйте API NDK Thermal в Android 11 для отслеживания изменений температуры устройства и принятия мер по поддержанию более низкого энергопотребления и более низкой температуры устройства. Этот API аналогичен API Java Thermal ; вы можете использовать его для получения уведомлений об изменении теплового состояния или для прямого опроса текущего состояния.

Текст и ввод

Улучшены переходы 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
}

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() контроллера:

Котлин

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() {}
       });

Обновления библиотек отделения интенсивной терапии

В 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.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() .

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

Новая функция 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 . Эти методы позволяют включать и отключать одновременный захват звука независимо от выбранного сценария использования. См. раздел «Совместное использование аудиовхода» .

Выходной переключатель

В Android 11 реализовано новое поведение для приложений, использующих API Cast и MediaRouter.

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

Подключение

Улучшения функции Wi-Fi Passpoint

Для получения информации о возможностях Passpoint, добавленных в Android 11, см. Passpoint .

API для подбора Wi-Fi-сетей расширен.

В Android 11 расширен API подсказок Wi-Fi, что позволяет улучшить возможности управления сетью в вашем приложении, включая следующие функции:

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

Обновления службы проверки звонков

Начиная с 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 с одним и тем же полным доменным именем (FQDN).

Начиная с 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, такие как «Enter» и «Next», а также снимки экрана окон, в которых не включен флаг FLAG_SECURE .

Дополнительные функции

причины завершения процесса приложения

В Android 11 появился метод ActivityManager.getHistoricalProcessExitReasons() , который сообщает о причинах недавнего завершения процессов. Приложения могут использовать этот метод для сбора диагностической информации о сбоях, например, о том, вызвано ли завершение процесса ошибками ANR, проблемами с памятью или другими причинами. Кроме того, вы можете использовать новый метод setProcessStateSummary() для хранения пользовательской информации о состоянии для последующего анализа.

Метод getHistoricalProcessExitReasons() возвращает экземпляры класса ApplicationExitInfo , содержащего информацию о завершении процесса приложения. Вызвав getReason() для экземпляра этого класса, вы можете определить причину завершения процесса вашего приложения. Например, возвращаемое значение REASON_CRASH указывает на то, что в вашем приложении произошло необработанное исключение. Если вашему приложению необходимо обеспечить уникальность событий завершения, оно может поддерживать идентификатор, специфичный для приложения, например, хеш-значение, основанное на метке времени из метода getTimestamp() .

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

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

загрузчики ресурсов

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