Функции и API Android 9

В Android 9 (уровень API 28) появились новые функции и возможности для пользователей и разработчиков. В этом документе рассказывается о новых возможностях для разработчиков.

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

Позиционирование в помещении с помощью Wi-Fi RTT

Новые API RTT поддерживают позиционирование в помещении в ваших приложениях.

В Android 9 добавлена поддержка протокола Wi-Fi IEEE 802.11-2016, также известного как Wi-Fi Round-Trip-Time (RTT), чтобы вы могли использовать в своих приложениях позиционирование в помещении.

На устройствах с Android 9 и поддержкой оборудования ваши приложения могут использовать RTT API, чтобы измерять расстояние до ближайших точек доступа Wi-Fi с поддержкой RTT. На устройстве должны быть включены геолокация и поиск сетей Wi‑Fi (в разделе Настройки > Местоположение), а у приложения должно быть разрешение ACCESS_FINE_LOCATION. Для использования RTT устройству не нужно подключаться к точкам доступа. Чтобы обеспечить конфиденциальность, расстояние до точки доступа может определять только телефон. Точки доступа не имеют такой информации.

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

Благодаря этому вы можете создавать новые функции, например навигацию внутри зданий и сервисы, использующие точное местоположение, такие как голосовое управление (например, "Включи этот свет") и информацию на основе местоположения (например, "Есть ли специальные предложения на этот товар?").

Посмотрите, как используется WiFi RTT API, в демонстрационном приложении Android WifiRttScan.

Подробнее о местоположении по Wi-Fi: определение расстояния с помощью RTT…

Поддержка выреза на экране

Экран параметров для разработчиков с разными размерами вырезов

Как протестировать вырез на экране с помощью эмулятора

Android 9 поддерживает новейшие безрамочные экраны с вырезами для камер и динамиков. Класс DisplayCutout позволяет определять местоположение и форму нефункциональных областей, в которых не должен показываться контент. Чтобы определить наличие и расположение этих вырезов, используйте метод getDisplayCutout().

Новый атрибут макета окна layoutInDisplayCutoutMode позволяет приложению размещать контент вокруг вырезов на экране устройства. Вы можете задать для этого атрибута одно из следующих значений:

Вы можете имитировать вырез на экране на любом устройстве или эмуляторе под управлением Android 9, выполнив следующие действия:

  1. Включите параметры для разработчиков.
  2. На экране Режим разработчика прокрутите вниз до раздела Рисование и выберите Имитировать дисплей с вырезом.
  3. Выберите размер выреза.

Уведомления

В Android 9 появилось несколько улучшений уведомлений, которые доступны разработчикам, использующим API уровня 28 и выше.

Уведомления о сообщениях

MessagingStyle с прикрепленной фотографией.

Уведомление о сообщении

MessagingStyle с ответами и обсуждением.

Пример кода, в котором используются уведомления, в том числе функции Android 9, можно найти в People Sample.

Улучшенные возможности обмена сообщениями

В Android 7.0 (уровень API 24) и более поздних версиях можно добавить действие, позволяющее отвечать на сообщения или вводить другой текст прямо из уведомления. В Android 9 эта функция была улучшена:

  • Упрощенная поддержка участников чата. Класс Person используется для идентификации участников чата, включая их аватары и URI. Многие другие API, например addMessage(), теперь используют класс Person вместо CharSequence. Класс Person также поддерживает шаблон проектирования Builder.

  • Поддержка изображений. В Android 9 изображения теперь показываются в уведомлениях о сообщениях на телефонах. Чтобы показать изображение, используйте значок setData() в сообщении. В приведенном ниже фрагменте кода показано, как создать объект Person и сообщение с изображением.

Kotlin

// Create new Person.
val sender = Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build()
// Create image message.
val message = Message("Picture", time, sender)
        .setData("image/", imageUri)
val style = Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message)

Java

// Create new Person.
Person sender = new Person()
        .setName(name)
        .setUri(uri)
        .setIcon(null)
        .build();
// Create image message.
Message message = new Message("Picture", time, sender)
        .setData("image/", imageUri);
Notification.MessagingStyle style = new Notification.MessagingStyle(getUser())
        .addMessage("Check this out!", 0, sender)
        .addMessage(message);
  • Сохранение ответов в виде черновиков. Ваше приложение может получать EXTRA_REMOTE_INPUT_DRAFT, отправленный системой, когда пользователь случайно закрывает уведомление о сообщении. С помощью этого дополнения можно предварительно заполнять текстовые поля в приложении, чтобы пользователям было проще отвечать на сообщения.

  • Определять, является ли чат групповым. Вы можете использовать параметр setGroupConversation() , чтобы намеренно определить чат как групповой или негрупповой.

  • Задайте семантическое действие для намерения. Метод setSemanticAction() позволяет задать семантическое значение для действия, например "отметить как прочитанное", "удалить", "ответить" и т. д.

  • Умные ответы. В Android 9 поддерживаются те же варианты ответов, что и в мессенджере. Используйте RemoteInput.setChoices(), чтобы предоставить пользователю набор стандартных ответов.

Настройки канала, трансляции и режим "Не беспокоить"

В Android 8.0 появились каналы уведомлений, позволяющие создавать настраиваемые пользователем каналы для каждого типа уведомлений, которые вы хотите показывать. В Android 9 настройки каналов уведомлений упрощены:

  • Блокировка групп каналов. Теперь пользователи могут блокировать целые группы каналов в настройках уведомлений приложения. Вы можете использовать метод isBlocked(), чтобы определить, когда группа заблокирована, и не отправлять уведомления для каналов в этой группе.

    Кроме того, ваше приложение может запрашивать текущие настройки группы каналов с помощью нового метода getNotificationChannelGroup().

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

  • NotificationManager.Policy имеет три новые категории приоритета для режима "Не беспокоить":

  • В NotificationManager.Policy также добавлено семь новых констант режима "Не беспокоить", которые можно использовать для подавления визуальных прерываний:

Поддержка нескольких камер и обновления камеры

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

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

В Android 9 API для нескольких камер поддерживает монохромные камеры на устройствах с возможностями FULL или LIMITED. Монохромное изображение получается с помощью формата YUV_420_888 с Y в качестве оттенков серого, U (Cb) в качестве 128 и V (Cr) в качестве 128.

В Android 9 также добавлена поддержка внешних USB/UVC-камер на поддерживаемых устройствах.

ImageDecoder для объектов Drawable и Bitmap

В Android 9 представлен класс ImageDecoder, который обеспечивает современный подход к декодированию изображений. Используйте этот класс вместо API BitmapFactory и BitmapFactory.Options.

ImageDecoder позволяет создавать Drawable или Bitmap из буфера байтов, файла или URI. Чтобы декодировать изображение, сначала вызовите метод createSource() и передайте в него источник закодированного изображения. Затем вызовите метод decodeDrawable() или decodeBitmap() передав объект ImageDecoder.Source для создания Drawable или Bitmap. Чтобы изменить настройки по умолчанию, передайте OnHeaderDecodedListener в decodeDrawable() или decodeBitmap(). ImageDecoder вызывает функцию onHeaderDecoded() с шириной и высотой изображения по умолчанию, как только они становятся известны. Если закодированное изображение представляет собой анимированный GIF или WebP, функция decodeDrawable() возвращает объект Drawable, который является экземпляром класса AnimatedImageDrawable.

Задать свойства изображений можно несколькими способами:

  • Чтобы масштабировать декодированное изображение до точного размера, передайте целевые размеры в setTargetSize(). Вы также можете масштабировать изображения, используя размер выборки. Передайте размер выборки непосредственно в setTargetSampleSize().
  • Чтобы обрезать изображение в пределах масштабированного изображения, вызовите функцию setCrop().
  • Чтобы создать изменяемый растровый рисунок, передайте true в setMutableRequired().

ImageDecoder также позволяет добавлять к изображению сложные эффекты, например скругленные углы или круглые маски. Используйте setPostProcessor() с экземпляром класса PostProcessor, чтобы выполнить нужные команды рисования.

Анимация

В Android 9 появился класс AnimatedImageDrawable для рисования и показа анимированных изображений GIF и WebP. AnimatedImageDrawable работает так же, как и AnimatedVectorDrawable, поскольку поток отрисовки управляет анимацией AnimatedImageDrawable. Поток отрисовки также использует рабочий поток для декодирования, чтобы декодирование не мешало другим операциям в потоке отрисовки. Такая реализация позволяет приложению показывать анимированное изображение, не управляя его обновлениями и не мешая другим событиям в потоке UI приложения.

AnimatedImageDrawable можно декодировать с помощью экземпляра ImageDecoder. В приведенном ниже фрагменте кода показано, как использовать метод ImageDecoder для декодирования AnimatedImageDrawable:

Kotlin

@Throws(IOException::class)
private fun decodeImage() {
    val decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(resources, R.drawable.my_drawable))

    // Prior to start(), the first frame is displayed.
    (decodedAnimation as? AnimatedImageDrawable)?.start()
}

Java

private void decodeImage() throws IOException {
    Drawable decodedAnimation = ImageDecoder.decodeDrawable(
        ImageDecoder.createSource(getResources(), R.drawable.my_drawable));

    if (decodedAnimation instanceof AnimatedImageDrawable) {
        // Prior to start(), the first frame is displayed.
        ((AnimatedImageDrawable) decodedAnimation).start();
    }
}

ImageDecoder предлагает несколько способов изменить изображение. Например, с помощью метода setPostProcessor() можно изменить внешний вид изображения, например применить круглую маску или скругленные углы.

Видео в формате HDR VP9, сжатие изображений в формате HEIF и API для работы с медиаконтентом

В Android 9 встроена поддержка VP9 Profile 2 с расширенным динамическим диапазоном (HDR), поэтому вы можете показывать пользователям фильмы с HDR из YouTube, Google Play Фильмов и других источников на устройствах, поддерживающих HDR.

В Android 9 также добавлена поддержка кодирования изображений с помощью высокоэффективного формата файлов изображений (HEIF или HEIC), который позволяет улучшить сжатие и уменьшить использование места в хранилище и сетевых данных. Образцы статических изображений HEIF поддерживаются в классах MediaMuxer и MediaExtractor. Благодаря поддержке платформы на устройствах с Android 9 отправлять и использовать изображения HEIF с вашего внутреннего сервера стало проще. Убедившись, что ваше приложение поддерживает этот формат данных для обмена и отображения, попробуйте использовать HEIF в качестве формата хранения изображений. Вы можете преобразовать JPEG в HEIC с помощью ImageDecoder или BitmapFactory (который получает растровое изображение из файла JPEG). Затем с помощью HeifWriter можно записать статические изображения HEIF из буферов байтов YUV или экземпляров Surface или Bitmap.

Медиапоказатели также доступны в классах AudioTrack, AudioRecord и MediaDrm.

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

В Android 9 в API AAudio добавлена поддержка нескольких дополнительных атрибутов AAudioStream, в том числе использования, типа контента и предустановки для ввода. С помощью этих атрибутов можно создавать потоки, оптимизированные для приложений VoIP или видеокамер. Вы также можете задать идентификатор сеанса, чтобы связать поток AAudio с субмиксом, который может включать эффекты. Для управления эффектами используйте API AudioEffect.

В Android 9 представлен API AudioEffect для динамической обработки. Этот класс позволяет создавать многоэтапные аудиоэффекты на основе каналов, в том числе эквалайзер, многополосный компрессор и лимитер. Количество диапазонов и активных этапов можно настроить, а большинство параметров можно контролировать в реальном времени.

Чувствительность к стоимости передачи данных в JobScheduler

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

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

При добавлении вакансий используйте свойства setEstimatedNetworkBytes(), setPrefetch() и setRequiredNetwork(), чтобы JobScheduler мог правильно обрабатывать информацию. При выполнении задания используйте объект Network, возвращенный функцией JobParameters.getNetwork(). В противном случае будет использоваться сеть, заданная на устройстве по умолчанию, которая может не соответствовать вашим требованиям и привести к нежелательному расходу трафика.

Neural Networks API 1.1

API нейронных сетей был представлен в Android 8.1 (уровень API 27) для ускорения машинного обучения на устройстве. В Android 9 API расширен и улучшен, в нем добавлена поддержка девяти новых операций:

Известная проблема. При передаче тензоров ANEURALNETWORKS_TENSOR_QUANT8_ASYMM в операцию ANEURALNETWORKS_PAD, доступную в Android 9 и более поздних версий, выходные данные NNAPI могут не совпадать с выходными данными фреймворков машинного обучения более высокого уровня, например TensorFlow Lite. Вместо этого передавайте только ANEURALNETWORKS_TENSOR_FLOAT32 до устранения проблемы.

Кроме того, в API добавлена новая функция ANeuralNetworksModel_relaxComputationFloat32toFloat16(), которая позволяет указать, нужно ли рассчитывать ANEURALNETWORKS_TENSOR_FLOAT32 с диапазоном и точностью, соответствующими 16-битному формату записи с плавающей запятой IEEE 754.

Фреймворк автозаполнения

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

улучшения системы безопасности;

В Android 9 реализован ряд функций безопасности, которые описаны в следующих разделах:

защищенное подтверждение Android

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

Если пользователь примет заявление, Android Keystore получит и сохранит криптографическую подпись, защищенную кодом аутентификации сообщений с хешированием на основе ключа (HMAC). После того как Android Keystore подтвердит действительность сообщения, ваше приложение сможет использовать ключ, сгенерированный из trustedConfirmationRequired в доверенной среде выполнения (TEE), чтобы подписать сообщение, которое принял пользователь. Подпись с высокой степенью достоверности указывает на то, что пользователь видел заявление и согласился с ним.

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

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

Единое диалоговое окно биометрической аутентификации

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

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

Аппаратный модуль безопасности

На поддерживаемых устройствах с Android 9 или более поздней версии может быть установлен StrongBox KeyMint (ранее Keymaster) – реализация HAL KeyMint (ранее Keymaster), которая находится в аппаратном модуле безопасности. Модуль содержит следующие элементы:

  • Собственный процессор.
  • Надежное хранилище.
  • Генератор случайных чисел.
  • Дополнительные механизмы для защиты от несанкционированной установки приложений и вмешательства в пакеты.

При проверке ключей, хранящихся в StrongBox KeyMint, система подтверждает целостность ключа с помощью доверенной среды выполнения (TEE).

Подробнее об использовании StrongBox KeyMint можно узнать в статье Аппаратный модуль безопасности.

Безопасный импорт ключей в хранилище ключей

В Android 9 добавлена возможность безопасного импорта зашифрованных ключей в хранилище ключей с использованием формата ключей в кодировке ASN.1. Это обеспечивает дополнительную безопасность расшифровки ключей. Затем KeyMint расшифровывает ключи в хранилище ключей, поэтому содержимое ключей никогда не появляется в виде открытого текста в основной памяти устройства.

Подробнее о том, как импортировать зашифрованные ключи более безопасным способом…

Схема подписания APK с ротацией ключей

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

Подробнее о том, как выполнять ротацию ключей с помощью apksigner…

Возможность разрешить расшифровку ключа только на разблокированных устройствах

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

Чтобы ключ не расшифровывался, когда устройство заблокировано, включите флаг, передав значение true методу setUnlockedDeviceRequired(). После этого, когда экран пользователя заблокирован, любые попытки расшифровать или подписать данные с помощью этого ключа будут неудачными. Чтобы получить доступ к заблокированному устройству, необходимо ввести PIN-код, пароль, отпечаток пальца или другой доверенный фактор.

Поддержка устаревшего шифрования

Устройства с Android 9, поставляемые с Keymaster 4, поддерживают алгоритм тройного шифрования данных (Triple DES). Если ваше приложение взаимодействует с устаревшими системами, которым требуется алгоритм Triple DES, используйте этот тип шифрования при шифровании конфиденциальных учетных данных.

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

Прекращение поддержки WPS

Поддержка Wi-Fi Protected Setup (WPS) прекращена из соображений безопасности.

Резервные копии Android

В Android 9 добавлены новые функции и параметры для разработчиков, связанные с резервным копированием и восстановлением. Подробная информация об этих изменениях приведена в следующих разделах.

Резервные копии с клиентским шифрованием

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

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

Как задать условия для резервного копирования

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

Подробнее о том, как создать резервную копию данных на устройстве Android…

Специальные возможности

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

Семантика навигации

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

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

Названия панелей специальных возможностей

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

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

Чтобы указать название панели, используйте атрибут android:accessibilityPaneTitle. Вы также можете изменить название панели интерфейса, которая заменяется во время выполнения, с помощью setAccessibilityPaneTitle(). Например, вы можете указать заголовок для области контента объекта Fragment.

Навигация по заголовкам

Если в вашем приложении есть текстовый контент с логическими заголовками, задайте атрибуту android:accessibilityHeading значение true для элементов View, которые представляют эти заголовки. Добавление заголовков позволяет сервисам специальных возможностей помогать пользователям переходить от одного заголовка к другому. Любой сервис специальных возможностей может использовать эту функцию, чтобы улучшить навигацию по интерфейсу.

Групповая навигация и вывод

Программы чтения с экрана традиционно используют атрибут android:focusable, чтобы определить, когда следует читать объект ViewGroup или коллекцию объектов View как единое целое. Таким образом пользователи смогут понять, что просмотры логически связаны друг с другом.

В Android 8.1 и более ранних версий необходимо пометить каждый объект View в элементе ViewGroup как не допускающий фокусировку, а сам элемент ViewGroup – как допускающий. Из-за этого некоторые элементы View были отмечены как доступные для фокуса, что затрудняло навигацию с помощью клавиатуры.

В Android 9 и более поздних версий вместо атрибута android:focusable можно использовать атрибут android:screenReaderFocusable, если при фокусировке объекта View возникают нежелательные последствия. Программы чтения с экрана фокусируются на всех элементах, для которых задано значение true для атрибута android:screenReaderFocusable или android:focusable.

Удобные действия

В Android 9 добавлена поддержка удобных действий от имени пользователей:

Взаимодействие с подсказками
Добавленные функции фреймворка специальных возможностей позволяют использовать всплывающие подсказки в интерфейсе приложения. Используйте getTooltipText(), чтобы прочитать текст подсказки, и ACTION_SHOW_TOOLTIP и ACTION_HIDE_TOOLTIP, чтобы указать экземплярам View, показывать или скрывать подсказки.
Добавлены общие действия
В Android 9 добавлена поддержка двух дополнительных действий устройства в классе AccessibilityService. Ваш сервис может помочь пользователям заблокировать устройство и сделать скриншот, используя действия GLOBAL_ACTION_LOCK_SCREEN и GLOBAL_ACTION_TAKE_SCREENSHOT соответственно.

Сведения об изменении окна

В Android 9 отслеживать изменения в окнах приложения стало проще, поскольку теперь можно одновременно перерисовывать несколько окон. Когда происходит событие TYPE_WINDOWS_CHANGED, используйте API getWindowChanges(), чтобы определить, как изменились окна. При обновлении нескольких окон каждое из них создает свой набор событий. Метод getSource() возвращает корневое представление окна, связанного с каждым событием.

Если в приложении для объектов View заданы заголовки панели специальных возможностей, ваш сервис может распознавать, когда обновляется интерфейс приложения. Когда происходит событие TYPE_WINDOW_STATE_CHANGED, используйте типы, возвращаемые getContentChangeTypes(), чтобы определить, как изменилось окно. Например, фреймворк может определить, когда у панели появилось новое название или когда панель исчезла.

Вращение

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

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

Подробнее об изменениях в поведении…

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

Новый режим поворота экрана позволяет пользователям вручную запускать поворот экрана с помощью кнопки на системной строке.

Текст

В Android 9 появились следующие функции, связанные с текстом:

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

  • Лупа. Класс Magnifier – это виджет платформы, который предоставляет API лупы, позволяющий реализовать единообразную функцию лупы во всех приложениях.

  • Умное преобразование в ссылки. В Android 9 улучшен класс TextClassifier, который использует машинное обучение, чтобы распознавать некоторые объекты в выделенном тексте и предлагать действия. Например, TextClassifier позволяет приложению определить, что пользователь выбрал номер телефона. После этого приложение может предложить пользователю позвонить по этому номеру. Функции в TextClassifier заменяют функциональность класса Linkify.

  • Макет текста. Несколько удобных методов и атрибутов упрощают реализацию дизайна интерфейса. Подробную информацию можно найти в справочной документации по TextView.

Предварительное преобразование файлов DEX в ART

На устройствах с Android 9 или более поздней версии компилятор Android Runtime (ART) дополнительно оптимизирует сжатые файлы Dalvik Executable (DEX), преобразуя файлы DEX в пакете приложения в более компактное представление. Это изменение позволяет приложению быстрее запускаться и занимать меньше места на диске и в ОЗУ.

Это особенно полезно для бюджетных устройств с низкой скоростью ввода-вывода данных на диск.

Системная трассировка на устройстве

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

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

Подробнее о системной трассировке на устройстве…