Это продолжение перевода, начатой здесь: https://myachinqa.blogspot.ru/2018/03/android-p-api-1-wi-fi-rtt-imagedecoder.html Разумеется, я снова рекомендую во-первых читать оригинал, во-вторых дождаться финальной версии статьи. Пока делался перевод второй части, я уже увидел изменения, которые Google успел сделать за несколько дней. Думаю, к релизу их будет ещё несколько.
Чтобы хоть как-то оправдать чтение моего перевода, а не оригинала, я добавил свои комментарии, помогающие прояснить некоторые возможные вопросы.
Анимация
В Android P появился новый класс для отрисовки и отображения анимированных GIF и WebP — AnimatedImageDrawable. Как и в ситуации с AnimatedVectorDrawable, анимацией в AnimatedImageDrawable управляет RenderThread. Операции декодирования RenderThread выполняет в рабочем потоке, потому они не мешают самому RenderThread. Благодаря такой реализации в вашем приложении могут быть анимированные изображения и при этом нет нужды заботиться их управлением или переживать, что они будут оказывать влияние на UI поток.
AnimagedImageDrawable может быть декодирован новым ImageDecoder. Код ниже как раз показывает использование ImageDecoder для декодирования AnimatedImageDrawable:
AnimagedImageDrawable может быть декодирован новым ImageDecoder. Код ниже как раз показывает использование ImageDecoder для декодирования AnimatedImageDrawable:
Drawable d = ImageDecoder.decodeDrawable(...); if (d instanceof AnimatedImageDrawable) { ((AnimatedImageDrawable) d).start(); // Prior to start(), the first frame is displayed }
У ImageDecoder есть несколько методов, которые позволяют дополнительно модифицировать изображения. Например, используя метод setPostProcessor() можно сделать изображение круглым или или со скруглёнными углами.
В Android P была добавлена поддержка формата графических файлов HEIF (heic).
Прим. перев.: в этом формате сохраняются фотографии в iOS 11, например. Кроме того, в последнем на сегодня preview Windows 10 тоже добавили поддержку этого формата. Расшифровывается как High Efficiency Image File Format, а heic — это одно из допустимых расширение файлов (как .jpg/.jpeg, так и .heif/.heic), которое использует Apple. По тексту будет использоваться оборот «неподвижные изображения», потому что сам по себе формат позволяет работать даже с видео и аудио или просто с набором изображений.
Статические изображения HEIF поддерживаются в классах MediaMuxer и MediaExtractor. Сам же формат имеет хорошее сжатие и экономит место на диске и сетевой трафик. И теперь вы без проблем можете передавать с вашего бэкэнда изображения в этом формате и отображать их на устройствах, если добавите его поддержку в ваши приложения. Вы можете перевести jpeg в heic, используя ImageDecoder или BitmapFactory. Кроме того вы можете использовать HeifWriter из новой Support Library (пока в альфе), чтобы записать неподвижные изображения в формате HEIF из YUV byte buffer, Surface или Bitmap.
Кроме того, в Android P появился MediaPlayer2. Теперь плеер поддерживает плейлисты, которые нужно собрать средствами DataSourceDesc. Чтобы создать экземпляр MediaPlayer2, используйте MediaPlayer2.create().
Из классов AudioTrack, AudioRecord и MediaDrm теперь доступны метрики медиа.
Плюс в Android P в класс MediaDRM добавились новые методы для получения таких метрик как уровни HDCP (Прим. перев.: DRM для медиа от Intel), уровни безопасности и количество сессий. Вообще, теперь у вас больше возможностей контролировать уровни безопасности, так что больше информации ищите в API Diff report.
При создании создании задачи можно сообщить об ожидаемом объёме данных, желаемом уровне сигнала и других «пожеланиях» к сети. Оператор может может сообщить, занята ли сеть или нет, лимитная ли она или безлимитная, а уже на основе ответов провайдера JobScheduler будет управлять задачами и вообще следить за состоянием сети. Например, если сеть перегружена, JobScheduler может отложить большие сетевые запросы. В случае же нахождения в безлимитной сети JobScheduler может запускать задачи в упреждение (в смысле заранее), дабы пользователю было комфортно. К примеру, подгрузить ленту новостей.
Так что добавляя задачи, убедитесь, что вы используете setEstimatedNetworkBytes(), setIsPrefetch() и setRequiredNetwork(). Эти данные помогут JobScheduler'у лучше управлять ими в разных сетях. Убедитесь, что вы используете объект Network, возвращаемый JobParameters.getNetwork(). В противном случае вы неявно будете использовать только текущее сетевое подключение устройства, которое вообще может не отвечать вашим собственным требованиям к качеству сети.
Впервые API нейросетей, нужные для ускорения машинного обучения на самом устройстве, появились в Android 8.1 (API level 27). В Android P API расширены и улучшены — добавлено 9 новых операторов: Pad, BatchToSpaceND, SpaceToBatchND, Transpose, Strided Slice, Mean, Div, Sub и Squeeze.
Фреймворк автоматического заполнения полей появился в Android 8.0 (API level 26) и нужен для простого заполнения внешних (по отношению к вашему приложению) форм. В Android P фреймворк был доработан, улучшен. Теперь вы можете сделать работу пользователя в системе ещё более комфортной. За деталями обратитесь к статье Autofill Framework. Прим. перев.: Это самое отвратительное описание изменений. Блин, Гугл, тебе жалко было хоть три строчки добавить?!
В Android P появилось несколько новых фич безопасности, включая единообразный диалог аутентификации по отпечатку пальца и гарантирование понимания пользователя, что происходит передача чувствительных данных. Больше информации смотрите на странице Security Updates.
А чтобы больше узнать о резервном копировании данных на Android устройствах, смотрите Data Backup.
В Android P появилось несколько действий, атрибутов и методов, которые упростят работу с фреймворком специальных возможностей.
Чтобы узнать, как сделать приложение более доступным для людей с ограниченными возможностями и как использовать сервис специальных возможностей, смотрите Accessibility.
К примеру, в приложении-магазине можно перемещать пользователя напрямую от одной категории товаров к другой, не заставляя его проходить по каждому элементу внутри этих категорий.
Прим. перев.: речь ниже пойдёт о специальной доработке, которая поможет внешним приложениям-считывателям с экранов работать с вашим собственным приложением. То есть если с вашим приложением взаимодействует слабовидящий или незрячий пользователь, он это делает через специальное приложение, которое считывает экран и каким-либо образом передаёт пользователю информацию о том, что удалось считать. В более-менее удобном виде. Пример такого приложение — Talk Back.
Вот как раз для таких считывалок и появились специальные заголовки, которые помогут считывалке работать с вашим приложением. В конечном итоге, самому пользователю будет проще взаимодействовать с вашим приложением.
До Android P сервис специальных возможностей не позволял беспроблемно понять, какая именно область экрана обновилась. К примеру, при перемещении фрагментов.
Начиная с Android P области имеют заголовки (прим. перев.: они же названия, подписи, титры; оригинальный термин — title), назвающиеся панелью заголовков специальных возможностей (прим. перев.: в оригинале — accessibility pane titles). Сервис специальных возможностей может узнавать об изменениях в этих заголовках, позволяя им предоставлять детальную информацию об этих изменениях.
Чтобы задать заголовок области, используйте новый атрибут android:accessibilityPaneTitle. Чтобы обновить заголовок какой-либо UI области при выполнении приложения, вызовите setAccessibilityPaneTitle(). Например, вы можете предоставлять заголовок в объекте Fragment конкретно для области, в которой находится важный контент.
Если вы в своём приложении отображаете какой-либо контент, имеющий логические заголовки, то для экземпляра View, который этот контент отображает, выставите в true новый атрибут android:accessibilityHeading. Это поможет пользователям легко переходить от одного заголовка к другому. Такой метод навигации часто используется в читалках экранов (прим. перев.: это специальный вид приложений для слабовидящих).
До Android P вам нужно было для каждого вложенного объекта View ставить «не получает фокус» и затем помечать всю группу этих объектов как «получает фокус». Из-за такого подхода, когда несколько экземпляров View помечались как «получает фокус», значительно затруднялась навигация по интерфейсу с клавиатуры.
В Android P, вы можете использовать новый атрибут android:screenReaderFocusable вместо атрибута android:focusable, если установка фокуса на вьюху приводила к нежелательным последствиям. Считывалки же экранов должны обрабатывать все элементы, для которых в true выставлен любой из этих двух атрибутов.
HDR VP9 видео, сжатие изображений HEIF и медиа API
В Android P была добавлена подддержка High Dynamic Range (HDR) VP9 Profile 2. Так что теперь вы можете предоставить своим пользователям фильмы с HDR, беря их на YouTube, Play Movies или любых других источниках, которые могут предоставить такой контент.В Android P была добавлена поддержка формата графических файлов HEIF (heic).
Прим. перев.: в этом формате сохраняются фотографии в iOS 11, например. Кроме того, в последнем на сегодня preview Windows 10 тоже добавили поддержку этого формата. Расшифровывается как High Efficiency Image File Format, а heic — это одно из допустимых расширение файлов (как .jpg/.jpeg, так и .heif/.heic), которое использует Apple. По тексту будет использоваться оборот «неподвижные изображения», потому что сам по себе формат позволяет работать даже с видео и аудио или просто с набором изображений.
Статические изображения HEIF поддерживаются в классах MediaMuxer и MediaExtractor. Сам же формат имеет хорошее сжатие и экономит место на диске и сетевой трафик. И теперь вы без проблем можете передавать с вашего бэкэнда изображения в этом формате и отображать их на устройствах, если добавите его поддержку в ваши приложения. Вы можете перевести jpeg в heic, используя ImageDecoder или BitmapFactory. Кроме того вы можете использовать HeifWriter из новой Support Library (пока в альфе), чтобы записать неподвижные изображения в формате HEIF из YUV byte buffer, Surface или Bitmap.
Кроме того, в Android P появился MediaPlayer2. Теперь плеер поддерживает плейлисты, которые нужно собрать средствами DataSourceDesc. Чтобы создать экземпляр MediaPlayer2, используйте MediaPlayer2.create().
Из классов AudioTrack, AudioRecord и MediaDrm теперь доступны метрики медиа.
Плюс в Android P в класс MediaDRM добавились новые методы для получения таких метрик как уровни HDCP (Прим. перев.: DRM для медиа от Intel), уровни безопасности и количество сессий. Вообще, теперь у вас больше возможностей контролировать уровни безопасности, так что больше информации ищите в API Diff report.
Экономия данных в JobScheduler
JobScheduler в Android P научился управлять задачами, завязанными на сеть, исходя из качества самой сети.При создании создании задачи можно сообщить об ожидаемом объёме данных, желаемом уровне сигнала и других «пожеланиях» к сети. Оператор может может сообщить, занята ли сеть или нет, лимитная ли она или безлимитная, а уже на основе ответов провайдера JobScheduler будет управлять задачами и вообще следить за состоянием сети. Например, если сеть перегружена, JobScheduler может отложить большие сетевые запросы. В случае же нахождения в безлимитной сети JobScheduler может запускать задачи в упреждение (в смысле заранее), дабы пользователю было комфортно. К примеру, подгрузить ленту новостей.
Так что добавляя задачи, убедитесь, что вы используете setEstimatedNetworkBytes(), setIsPrefetch() и setRequiredNetwork(). Эти данные помогут JobScheduler'у лучше управлять ими в разных сетях. Убедитесь, что вы используете объект Network, возвращаемый JobParameters.getNetwork(). В противном случае вы неявно будете использовать только текущее сетевое подключение устройства, которое вообще может не отвечать вашим собственным требованиям к качеству сети.
API 1.1 нейронных сетей
Впервые API нейросетей, нужные для ускорения машинного обучения на самом устройстве, появились в Android 8.1 (API level 27). В Android P API расширены и улучшены — добавлено 9 новых операторов: Pad, BatchToSpaceND, SpaceToBatchND, Transpose, Strided Slice, Mean, Div, Sub и Squeeze.
Фреймворк автозаполнения полей
Фреймворк автоматического заполнения полей появился в Android 8.0 (API level 26) и нужен для простого заполнения внешних (по отношению к вашему приложению) форм. В Android P фреймворк был доработан, улучшен. Теперь вы можете сделать работу пользователя в системе ещё более комфортной. За деталями обратитесь к статье Autofill Framework. Прим. перев.: Это самое отвратительное описание изменений. Блин, Гугл, тебе жалко было хоть три строчки добавить?!
Изменения в безопасности
В Android P появилось несколько новых фич безопасности, включая единообразный диалог аутентификации по отпечатку пальца и гарантирование понимания пользователя, что происходит передача чувствительных данных. Больше информации смотрите на странице Security Updates.
Шифрование резервных копий Android на стороне клиента
В Android P шифрование резервных копий данных Android (прим. перев.: речь о данных приложений) происходит на стороне клиента его собственным паролем. Потому при восстановлении данных из резервной копии (прим. перев.: предполагаю, что, например, на новом устройстве), потребуется ввести PIN, рисунок или password. Чтобы больше узнать о технологиях, на которых построена эта новая фича, ознакомьтесь с технической документацией Google Cloud Key Vault Service.А чтобы больше узнать о резервном копировании данных на Android устройствах, смотрите Data Backup.
Специальные возможности
В Android P появилось несколько действий, атрибутов и методов, которые упростят работу с фреймворком специальных возможностей.
Чтобы узнать, как сделать приложение более доступным для людей с ограниченными возможностями и как использовать сервис специальных возможностей, смотрите Accessibility.
Навигационная семантика
Мы добавили новые атрибуты, чтобы упростить вам перемещение с одной части экрана к другой. Эти атрибуты пригодятся вам, когда вы заходите помочь пользователю перемещаться по тексту или быстро перенести его к какой-то конкретной секции в вашем приложении.К примеру, в приложении-магазине можно перемещать пользователя напрямую от одной категории товаров к другой, не заставляя его проходить по каждому элементу внутри этих категорий.
Панель заголовков специальных возможностей
Прим. перев.: речь ниже пойдёт о специальной доработке, которая поможет внешним приложениям-считывателям с экранов работать с вашим собственным приложением. То есть если с вашим приложением взаимодействует слабовидящий или незрячий пользователь, он это делает через специальное приложение, которое считывает экран и каким-либо образом передаёт пользователю информацию о том, что удалось считать. В более-менее удобном виде. Пример такого приложение — Talk Back.
Вот как раз для таких считывалок и появились специальные заголовки, которые помогут считывалке работать с вашим приложением. В конечном итоге, самому пользователю будет проще взаимодействовать с вашим приложением.
До Android P сервис специальных возможностей не позволял беспроблемно понять, какая именно область экрана обновилась. К примеру, при перемещении фрагментов.
Начиная с Android P области имеют заголовки (прим. перев.: они же названия, подписи, титры; оригинальный термин — title), назвающиеся панелью заголовков специальных возможностей (прим. перев.: в оригинале — accessibility pane titles). Сервис специальных возможностей может узнавать об изменениях в этих заголовках, позволяя им предоставлять детальную информацию об этих изменениях.
Чтобы задать заголовок области, используйте новый атрибут android:accessibilityPaneTitle. Чтобы обновить заголовок какой-либо UI области при выполнении приложения, вызовите setAccessibilityPaneTitle(). Например, вы можете предоставлять заголовок в объекте Fragment конкретно для области, в которой находится важный контент.
Навигация по заголовкам
Если вы в своём приложении отображаете какой-либо контент, имеющий логические заголовки, то для экземпляра View, который этот контент отображает, выставите в true новый атрибут android:accessibilityHeading. Это поможет пользователям легко переходить от одного заголовка к другому. Такой метод навигации часто используется в читалках экранов (прим. перев.: это специальный вид приложений для слабовидящих).
Навигация по группам и внутри них
Обычно читалки экранов ориентируются на атрибут android:focusable, дабы определить, какая область экрана должна быть прочитана как отдельный элемент. Иногда читалкам нужно определить содержимое нескольких объектов View как единый элемент — тогда пользователи могут понять, что все эти вьюхи логически связаны между собой.До Android P вам нужно было для каждого вложенного объекта View ставить «не получает фокус» и затем помечать всю группу этих объектов как «получает фокус». Из-за такого подхода, когда несколько экземпляров View помечались как «получает фокус», значительно затруднялась навигация по интерфейсу с клавиатуры.
В Android P, вы можете использовать новый атрибут android:screenReaderFocusable вместо атрибута android:focusable, если установка фокуса на вьюху приводила к нежелательным последствиям. Считывалки же экранов должны обрабатывать все элементы, для которых в true выставлен любой из этих двух атрибутов.
Удобные действия
Для удобства пользователей, в Android P добавлена поддержка удобных действий:
Взаимодействие со всплывающими подсказками:
Это новая возможность фреймворка специальных возможностей. Она даёт доступ ко всплывающим подсказкам внутри приложений. Для чтения текста всплывающей подсказки используйте getTooltipText(), а для того, чтобы заставить вьюху показать или скрыть подсказку, используйте ACTION_SHOW_TOOLTIP и ACTION_HIDE_TOOLTIP.
Это новая возможность фреймворка специальных возможностей. Она даёт доступ ко всплывающим подсказкам внутри приложений. Для чтения текста всплывающей подсказки используйте getTooltipText(), а для того, чтобы заставить вьюху показать или скрыть подсказку, используйте ACTION_SHOW_TOOLTIP и ACTION_HIDE_TOOLTIP.
Новые глобальные действия:
В Android P появилась поддержка двух новых действий над устройствами, реализованных в классе AccessibilityService. Теперь ваш сервис может помочь пользователям заблокировать экран и снять скриншот — для этого используйте действия GLOBAL_ACTION_LOCK_SCREEN и GLOBAL_ACTION_TAKE_SCREENSHOT соответственно.
В случае, если в приложении заданы панели заголовков для вьюх, ваш сервис сможет узнавать об изменениях в UI этого приложения. Чтобы понять, как именно изменилось окно, при возникновении события TYPE_WINDOW_STATE_CHANGED используйте новые типы, возвращаемые getContentChangeTypes(). К примеру, фреймворк поможет обнаружить, что панель получила новый заголовок или что панель исчезла.
В Android P появилась поддержка двух новых действий над устройствами, реализованных в классе AccessibilityService. Теперь ваш сервис может помочь пользователям заблокировать экран и снять скриншот — для этого используйте действия GLOBAL_ACTION_LOCK_SCREEN и GLOBAL_ACTION_TAKE_SCREENSHOT соответственно.
Больше информации об изменениях окон
Android P упрощает отслеживание изменений в окнах приложений в сценарии, когда приложение перерисовывает несколько окон одновременно. При получении события TYPE_WINDOWS_CHANGED, используйте API getWindowChanges(), чтобы понять, что изменилось в окнах. При обновлении одновременно нескольких окон, каждое окно создаёт свой собственный набор событий и метод getSource() вернёт оригинальный вид окна для каждого из этих событий.В случае, если в приложении заданы панели заголовков для вьюх, ваш сервис сможет узнавать об изменениях в UI этого приложения. Чтобы понять, как именно изменилось окно, при возникновении события TYPE_WINDOW_STATE_CHANGED используйте новые типы, возвращаемые getContentChangeTypes(). К примеру, фреймворк поможет обнаружить, что панель получила новый заголовок или что панель исчезла.
Переворот
Чтобы убрать ненужные перевороты изображений, мы добавили новый режим, который закрепляет текущую ориентацию, даже если положение устройства в пространстве изменяется. Если пользователь пожелает, он может перевернуть изображение вручную, нажав на новую кнопку в области уведомлений.В подавляющем большинстве ситуаций это изменение никак не затронет приложениях. Но если ваше приложение имеет какое-то особенное поведение при перевороте изображения или использует какие-то особенные (прим. перев.: в оригинале использовано чудное слово — «изотерические»; я теперь тоже так буду называть любое не очевидное поведение) настройки ориентации экрана, вы можете столкнуться с проблемами при ручном перевороте изображения.
Чтобы убедиться, что всё в порядке, проверьте поведение вашего приложения на всех ключевых экранах во всех ориентациях.
Больше информации в «Изменениях поведений».
Теперь пользователь может перевернуть изображение, даже если разработчик заблокировал автоматический поворот |
Комментариев нет:
Отправить комментарий