Android 9 (уровень API 28) представляет замечательные новые функции и возможности для пользователей и разработчиков. В этом документе описываются новые возможности для разработчиков.
Чтобы узнать о новых API, прочтите отчет о различиях API или посетите справочник по API Android . Также обязательно ознакомьтесь с изменениями в поведении Android 9, чтобы узнать об областях, в которых изменения платформы могут повлиять на ваши приложения.
Позиционирование в помещении с помощью Wi-Fi RTT
![Новые API-интерфейсы RTT поддерживают позиционирование внутри ваших приложений.](https://developer.android.google.cn/static/images/about/versions/pie/rtt-nav.png?authuser=9&hl=ru)
В Android 9 добавлена поддержка платформы для протокола Wi-Fi IEEE 802.11-2016, также известного как Wi-Fi Round-Trip-Time (RTT), чтобы вы могли использовать преимущества позиционирования в помещении в своих приложениях.
На устройствах под управлением Android 9 с аппаратной поддержкой ваши приложения могут использовать API-интерфейсы RTT для измерения расстояния до ближайших точек доступа Wi-Fi (AP) с поддержкой RTT. На устройстве должны быть включены службы определения местоположения и включено сканирование Wi-Fi (в разделе «Настройки» > «Местоположение» ), а ваше приложение должно иметь разрешение ACCESS_FINE_LOCATION
. Для использования RTT устройству не требуется подключение к точкам доступа. Для сохранения конфиденциальности только телефон способен определять расстояние до точки доступа; точки доступа не имеют этой информации.
Если ваше устройство измеряет расстояние до 3 или более точек доступа, вы можете использовать алгоритм мультилатерации, чтобы оценить положение устройства, которое лучше всего соответствует этим измерениям. Результат обычно имеет точность в пределах 1-2 метров.
Благодаря такой точности вы можете создавать новые возможности, такие как навигация внутри здания и детализированные услуги на основе местоположения, такие как голосовое управление с возможностью однозначного определения (например, «Включите этот свет» ) и информация о местоположении (например, «Где есть специальные предложения на этот товар?" ).
См. API-интерфейс WiFi RTT, используемый в демонстрационном приложении Android WifiRttScan .
Дополнительную информацию см. в разделе Местоположение Wi-Fi: в диапазоне от RTT .
Поддержка выреза дисплея
![Экран параметров разработчика, показывающий различные размеры вырезов](https://developer.android.google.cn/static/images/about/versions/pie/emulator-devoptions-cutout_2x.png?authuser=9&hl=ru)
Тестирование выреза дисплея с помощью эмулятора
Android 9 поддерживает новейшие безрамочные экраны с вырезами для камер и динамиков. Класс DisplayCutout
позволяет узнать расположение и форму нефункциональных областей, где контент не должен отображаться. Чтобы определить наличие и размещение этих областей выреза, используйте метод getDisplayCutout()
.
Новый атрибут макета окна, layoutInDisplayCutoutMode
, позволяет вашему приложению размещать свое содержимое вокруг вырезов устройства. Вы можете установить для этого атрибута одно из следующих значений:
-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
-
LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
Вы можете смоделировать вырез экрана на любом устройстве или эмуляторе под управлением Android 9 следующим образом:
- Включите параметры разработчика .
- На экране «Параметры разработчика» прокрутите вниз до раздела «Рисование» и выберите « Имитировать дисплей с вырезом» .
- Выберите размер выреза.
Уведомления
В Android 9 представлено несколько улучшений уведомлений, все из которых доступны разработчикам, ориентированным на уровень API 28 и выше.
![Уведомления о сообщениях](https://developer.android.google.cn/static/images/about/versions/pie/p-messaging.jpg?authuser=9&hl=ru)
MessagingStyle с прикрепленной фотографией.
![Уведомление о сообщениях](https://developer.android.google.cn/static/images/about/versions/pie/p-replies.jpg?authuser=9&hl=ru)
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 для поддержки Flash на основе дисплея и доступа к временным меткам 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, сжатие изображений HEIF и медиа API
Android 9 обеспечивает встроенную поддержку профиля 2 VP9 с расширенным динамическим диапазоном (HDR), поэтому вы можете доставлять своим пользователям фильмы с поддержкой HDR с YouTube, Play Movies и других источников на устройствах с поддержкой HDR.
В Android 9 также добавлена поддержка кодирования изображений с использованием формата файлов изображений High Efficiency ( 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 представлено множество улучшений, которые могут быть реализованы службами автозаполнения для дальнейшего улучшения пользовательского опыта при заполнении форм. Чтобы узнать больше о том, как использовать функции автозаполнения в вашем приложении, см. руководство по платформе автозаполнения .
Улучшения безопасности
В Android 9 представлен ряд функций безопасности, которые кратко описаны в следующих разделах:
Подтверждение защиты Android
Поддерживаемые устройства под управлением Android 9 или более поздней версии дают вам возможность использовать защищенное подтверждение Android. При использовании этого рабочего процесса ваше приложение отображает пользователю приглашение с просьбой утвердить короткое заявление. Это заявление позволяет приложению подтвердить, что пользователь желает выполнить конфиденциальную транзакцию, например произвести платеж.
Если пользователь принимает запрос, Android Keystore получает и сохраняет криптографическую подпись, защищенную кодом аутентификации сообщения с хеш-ключом (HMAC). После того как хранилище ключей Android подтвердит действительность сообщения, ваше приложение может использовать ключ, сгенерированный из trustedConfirmationRequired
в доверенной среде выполнения (TEE), для подписи сообщения, которое принял пользователь. Подпись с очень высокой степенью достоверности указывает на то, что пользователь ознакомился с заявлением и согласился с ним.
Внимание: Android Protected Confirmation не обеспечивает безопасный канал передачи информации для пользователя. Ваше приложение не может принимать на себя никаких гарантий конфиденциальности, кроме тех, которые предлагает платформа Android. В частности, не используйте этот рабочий процесс для отображения конфиденциальной информации, которую вы обычно не показываете на устройстве пользователя.
Инструкции по добавлению поддержки Android Protected Confirmation см. в руководстве Android Protected Confirmation .
Диалоговое окно единой биометрической аутентификации
В Android 9 система предоставляет диалоговые окна биометрической аутентификации от имени вашего приложения. Эта функция создает стандартизированный внешний вид и размещение диалогового окна, давая пользователям больше уверенности в том, что они проходят проверку подлинности с помощью надежного средства проверки биометрических учетных данных.
Если ваше приложение использует FingerprintManager
для отображения диалогового окна аутентификации по отпечатку пальца для пользователей, вместо этого переключитесь на использование BiometricPrompt
. BiometricPrompt
использует систему для отображения диалогового окна аутентификации. Он также меняет свое поведение, чтобы адаптироваться к типу биометрической аутентификации, выбранному пользователем.
Аппаратный модуль безопасности
Поддерживаемые устройства под управлением Android 9 или более поздней версии могут иметь StrongBox Keymaster — реализацию Keymaster HAL, которая находится в аппаратном модуле безопасности. Модуль содержит следующее:
- Свой процессор.
- Безопасное хранение.
- Настоящий генератор случайных чисел.
- Дополнительные механизмы для защиты от подделки пакетов и несанкционированной загрузки приложений.
При проверке ключей, хранящихся в StrongBox Keymaster, система подтверждает целостность ключа с помощью доверенной среды выполнения (TEE).
Чтобы узнать больше об использовании Strongbox Keymaster, см. Модуль аппаратной безопасности .
Безопасный импорт ключей в хранилище ключей
Android 9 обеспечивает дополнительную безопасность расшифровки ключей, добавляя возможность безопасного импорта зашифрованных ключей в хранилище ключей с использованием формата ключей в кодировке ASN.1. Затем Keymaster расшифровывает ключи в хранилище ключей, поэтому содержимое ключей никогда не отображается в виде открытого текста в памяти хоста устройства.
Узнайте больше о том, как более безопасно импортировать зашифрованные ключи .
Схема подписи APK с ротацией ключей
В Android 9 добавлена поддержка схемы подписи APK v3. Эта схема имеет возможность включать запись подтверждения ротации в блок подписи для каждого сертификата подписи. Эта возможность позволяет вашему приложению подписывать новый сертификат подписи, связывая предыдущие сертификаты подписи APK-файла с тем, которым оно подписано сейчас.
Узнайте больше о том, как повернуть клавиши с помощью apksigner
.
Возможность разрешить расшифровку ключей только на разблокированных устройствах.
В Android 9 появился флаг unlockedDeviceRequired
. Этот параметр определяет, требует ли хранилище ключей разблокировки экрана перед разрешением расшифровки любых текущих или сохраненных данных с использованием указанного ключа. Эти типы ключей хорошо подходят для шифрования конфиденциальных данных для хранения на диске, например медицинских или корпоративных данных. Флаг дает пользователям более высокую гарантию того, что данные не могут быть расшифрованы, пока устройство заблокировано, в случае потери или кражи телефона.
Чтобы защитить ключ от расшифровки, пока устройство заблокировано, включите этот флаг, передав true
методу setUnlockedDeviceRequired()
. После выполнения этого шага, когда экран пользователя заблокирован, любые попытки расшифровать или подписать данные с помощью этого ключа завершаются неудачей. Для доступа к заблокированному устройству требуется PIN-код, пароль, отпечаток пальца или какой-либо другой доверенный фактор.
Поддержка устаревшего шифрования
Устройства Android 9, поставляемые с Keymaster 4, поддерживают алгоритм тройного шифрования данных или тройной DES. Если ваше приложение взаимодействует с устаревшими системами, требующими Triple DES, используйте этот тип шифрования при шифровании конфиденциальных учетных данных.
Чтобы узнать больше о том, как сделать ваше приложение более безопасным, см. раздел Безопасность для разработчиков Android .
Устаревание WPS
Защищенная настройка Wi-Fi (WPS) устарела по соображениям безопасности.
Резервные копии Android
В Android 9 добавлены новые функции и возможности для разработчиков, связанные с резервным копированием и восстановлением. Подробности об этих изменениях приведены в следующих разделах.
Резервные копии с шифрованием на стороне клиента
В Android 9 добавлена поддержка шифрования резервных копий Android с помощью секрета на стороне клиента. Эта поддержка включается автоматически при выполнении следующих условий:
- Пользователь включил резервное копирование с помощью Android 9 или более поздней версии.
- Пользователь установил блокировку экрана для своего устройства, для разблокировки которой требуется PIN-код, графический ключ или пароль.
Если эта мера конфиденциальности включена, для восстановления данных из резервных копий, сделанных устройством пользователя, потребуется PIN-код, шаблон или пароль устройства. Чтобы узнать больше о технологии, лежащей в основе этой функции, ознакомьтесь с техническим описанием службы Google Cloud Key Vault .
Определите условия устройства, необходимые для резервного копирования.
Если данные вашего приложения содержат конфиденциальную информацию или настройки, 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()
, чтобы определить, как изменилось окно. Например, платформа может определить, когда у панели появился новый заголовок или когда панель исчезла.
Вращение
Чтобы исключить непреднамеренные повороты, мы добавили режим, который фиксирует текущую ориентацию, даже если положение устройства меняется. При необходимости пользователи могут запускать вращение вручную, нажав кнопку на системной панели.
Влияние на совместимость приложений в большинстве случаев минимально. Однако если ваше приложение имеет какое-либо настраиваемое поведение поворота или использует какие-либо необычные настройки ориентации экрана, вы можете столкнуться с проблемами, которые раньше оставались бы незамеченными, когда для предпочтения поворота пользователя всегда было установлено портретное значение. Мы рекомендуем вам взглянуть на поведение поворота во всех ключевых действиях вашего приложения и убедиться, что все настройки ориентации экрана по-прежнему обеспечивают оптимальную работу.
Более подробную информацию см. в соответствующих изменениях поведения .
![Вращающийся мобильный телефон демонстрирует новый режим ротации, позволяющий пользователям вручную запускать ротацию](https://developer.android.google.cn/static/images/about/versions/pie/rotate-changes.gif?authuser=9&hl=ru)
Новый режим вращения позволяет пользователям при необходимости запускать вращение вручную с помощью кнопки на системной панели.
Текст
Android 9 добавляет на платформу следующие функции, связанные с текстом:
Предварительно вычисляемый текст. Класс
PrecomputedText
повышает производительность рендеринга текста, позволяя заранее вычислять и кэшировать необходимую информацию. Это также позволяет вашему приложению выполнять макет текста вне основного потока.Magnifier: класс
Magnifier
— это виджет платформы, который предоставляет API лупы, обеспечивающий единообразную работу функций лупы во всех приложениях.Smart Linkify: Android 9 расширяет класс
TextClassifier
, который использует машинное обучение для идентификации некоторых объектов в выделенном тексте и предложения действий. Например,TextClassifier
может позволить вашему приложению обнаружить, что пользователь выбрал номер телефона. Затем ваше приложение может предложить пользователю позвонить по этому номеру. ФункцииTextClassifier
заменяют функциональность классаLinkify
.Макет текста: несколько удобных методов и атрибутов упрощают реализацию дизайна пользовательского интерфейса. Подробности смотрите в справочной документации по
TextView
.
ART предварительное преобразование файлов DEX
На устройствах под управлением Android 9 или более поздней версии предварительный компилятор среды выполнения Android (ART) дополнительно оптимизирует сжатые файлы формата Dalvik Executable (DEX), преобразуя файлы DEX в пакете приложения в более компактное представление. Это изменение позволяет вашему приложению запускаться быстрее и потреблять меньше дискового пространства и оперативной памяти.
Это улучшение особенно полезно для устройств начального уровня с более низкой скоростью дискового ввода-вывода.
Отслеживание системы на устройстве
Android 9 позволяет записывать системные следы с вашего устройства, а затем делиться отчетом об этих записях со своей командой разработчиков. Этот отчет поддерживает несколько форматов, включая HTML.
Собирая эти трассировки, вы можете собирать данные о времени, связанные с процессами и потоками вашего приложения, а также просматривать другие типы глобально значимых состояний устройства.
Дополнительные сведения об этом инструменте см. в разделе Выполнение трассировки системы на устройстве .