Функции и API Android 9

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

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

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

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

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

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

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

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

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

Для получения дополнительной информации см. Местоположение Wi-Fi: определение местоположения с помощью RTT .

Поддержка выреза на дисплее

Экран параметров разработчика, на котором показаны вырезы разных размеров

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

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

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

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

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

Уведомления

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

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

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

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

MessagingStyle с ответами и беседой.

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

Улучшенный опыт обмена сообщениями

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

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

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

Котлин

// 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)

Ява

// 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() позволяет придать семантическое значение действию, например «отметить как прочитанное», «удалить», «ответить» и т. д.

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

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

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

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

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

  • Новые типы намерений для широковещательных уведомлений: Система Android теперь отправляет намерения для широковещательных уведомлений при изменении состояния блокировки каналов уведомлений и групп каналов. Приложение, владеющее заблокированным каналом или группой, может отслеживать эти намерения и реагировать соответствующим образом. Подробнее об этих действиях с намерениями и дополнительных возможностях см. в обновлённом списке констант в справочнике NotificationManager . Подробнее о реагировании на намерения для широковещательных уведомлений см. в разделе «Трансляции» .

  • NotificationManager.Policy имеет три новые категории приоритетов «Не беспокоить»:

    • PRIORITY_CATEGORY_ALARMS устанавливает приоритеты тревог.
    • PRIORITY_CATEGORY_MEDIA отдает приоритет звукам из источников мультимедиа, таких как мультимедиа и голосовая навигация.
    • PRIORITY_CATEGORY_SYSTEM задает приоритет системных звуков.
  • NotificationManager.Policy также имеет семь новых констант «Не беспокоить», которые можно использовать для подавления визуального прерывания:

    • SUPPRESSED_EFFECT_FULL_SCREEN_INTENT не позволяет уведомлению запускать полноэкранное действие.
    • SUPPRESSED_EFFECT_LIGHTS блокирует световые индикаторы уведомлений.
    • SUPPRESSED_EFFECT_PEEK предотвращает кратковременное появление уведомлений («заглядывание»).
    • SUPPRESSED_EFFECT_STATUS_BAR предотвращает появление уведомлений в строке состояния на устройствах, поддерживающих строки состояния.
    • SUPPRESSED_EFFECT_BADGE блокирует значки на устройствах, поддерживающих их. Подробнее см. в статье Изменение значка уведомления .
    • SUPPRESSED_EFFECT_AMBIENT блокирует уведомления на устройствах, поддерживающих фоновую подсветку.
    • SUPPRESSED_EFFECT_NOTIFICATION_LIST предотвращает появление уведомлений в виде списка на устройствах, поддерживающих вид списка, например в области уведомлений или на экране блокировки.

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

На устройствах под управлением 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 для рисунков и растровых изображений

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

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

Котлин

@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()
}

Ява

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 Video, сжатие изображений HEIF и медиа API

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

Android 9 также добавляет поддержку кодирования изображений с использованием формата High Efficiency Image File ( 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 Diff .

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

API нейронных сетей 1.1

API нейронных сетей был представлен в Android 8.1 (API уровня 27) для ускорения машинного обучения на устройствах Android. В 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 представлено множество улучшений, которые сервисы автозаполнения могут реализовать для дальнейшего повышения удобства заполнения форм. Подробнее об использовании функций автозаполнения в вашем приложении см. в руководстве Autofill Framework .

Улучшения безопасности

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

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

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

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

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

Инструкции по добавлению поддержки Android Protected Confirmation см. в руководстве Android Protected Confirmation .

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

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

Узнайте больше о том, как выполнять ротацию ключей с помощью apksigner .

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

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

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

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

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

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

Устаревание WPS

Технология защищенной настройки Wi-Fi (WPS) устарела по соображениям безопасности.

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

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

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

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

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

Определить условия устройства, необходимые для резервного копирования

Если данные вашего приложения содержат конфиденциальную информацию или настройки, 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:screenReaderFocusable вместо атрибута android:focusable в ситуациях, когда фокусировка объекта View приводит к нежелательным последствиям. Программы чтения с экрана фокусируются на всех элементах, для которых атрибут android:screenReaderFocusable или android:focusable в true .

Действия для удобства

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

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

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

ART-преобразование файлов DEX заранее

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

Это улучшение особенно выгодно для устройств начального уровня с более низкой скоростью ввода-вывода на диск.

Отслеживание системы на устройстве

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

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

Дополнительную информацию об этом инструменте см. в разделе Выполнение трассировки системы на устройстве .