11 марта 2018 г.

Android P: Возможности и API. Ч. 1: от Wi-Fi RTT до ImageDecoder

Подсвечивание новых API

    Эта статья является переводом вот этой: https://developer.android.com/preview/features.html Как и всегда раньше, я рекомендую читать оригинал. Т.к. в оригинале 100% будут изменения текста, я буду обновлять и свою статью. Так что разумнее всего читать её после релиза. И эту, и оригинал — смотря что вам удобнее.
    Кроме того, здесь лишь половина от оригинала. Вторая часть находится под заголовком «ч. 2». Так и читать попроще, и корректировать точнее.

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

    Для изучения новых API, прочтите отчёт по API diff или посетите страницу со списком всех Android API — на ней новые API подсвечены, чтобы их было проще увидеть.
    Также ознакомьтесь со страницей «Изменение поведений Android P» (TODO: когда переведу и эту страницу, ссылку заменю), чтобы прикинуть, в каких местах могли быть задеты ваши приложения.


Использование Wi-Fi RTT для позиционирования в помещениях

В будущем телефон сможет заменить
стенды с навигацией в Меге и Авиапарке
Картинка взята из оригинальной статьиПасхалка 1: время на часах
    Благодаря новым RTT API ваши приложения будут поддерживать позиционирование внутри зданий.  

    Прим. перев.: Обращаю внимание читателя, что речь идёт о позиционировании, а не о навигации. Навигация — программная задача, которую невозможно выполнить, не зная, к примеру, расположение препятствий и возможных путей маршрутов. Но чтобы начать навигацию вообще, нужно определить текущее местоположение. Вот это и есть прямая задача позиционирования. То есть радиосигнал используется только чтобы найти вас, а дальше приложения, используя свои алгоритмы и «знания» местности будут строить маршруты. Так что если у кого-то встретите фразу «навигация по Wi-Fi сетям» в контексте описания Android P, прекратите читать/слушать этого человека.

    В реализацию протокола Wi-Fi в Android P была добавлена поддержка IEEE 802.11mc, также известного как Wi-Fi Round-Trip-Time (RTT, «круговая задержка» или «время приёма-передачи»: см. здесь и здесь), которая поможет вашим приложениям улучшить позиционирование внутри помещений.

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

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

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

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

Тестирование приложения на устройстве
с монобровью. Холст. Эмулятор.
Картинка взята из оригинальной статьи

Пасхалка 2: время на часах
Прим. перев.: уже устоявшееся название для  откусанных участков дисплеев — «монобровь».

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

    Новый атрибут компоновки окна layoutInDisplayCutoutMode позволит вашему приложению располагать контент вокруг моноброви устройства. Вы можете поставить атрибуту одно из этих значений:
    Для имитации моноброви на любом устройстве или эмуляторе (разумеется, работающими под Android P), нужно сделать следующее:
  1. Включить developer options
  2. На экране Developer options прокрутить до секции Drawing и выбрать Simulate a display with a cutout
  3. Выбрать размер моноброви
Замечание: Мы рекомендуем протестировать, как ваше приложение будет отображаться на экране с монобровью

Уведомления

    Android P вводит расширенные возможности уведомлений, доступных для приложений с target Android P и выше.

Прокачка программ для общения

MessagingStyle с фото
     Прим. перев.: До начала секции нужно уточнить, о чём идёт речь. Не просто так в заголовке написано про программы для общения и вообще в тексте используется оборот «уведомления мессенджеров».
    Приложения очень давно, ещё в 4-ых Андроидах, могли отображать картинки в уведомлениях и вешать свои действия (хотя там действия и были примитивными). Здесь же речь идёт про специальные «стилевые» уведомления, которые нужны для того, чтобы все приложения похожих типов отображали похожие уведомления. Пользователю не очень приятно, что пять его мессенджеров отображают пять совершенно непохожих уведомлений. Потому в данном случае речь про вот такие «стилевые» уведомления: https://developer.android.com/reference/android/app/Notification.MessagingStyle.html 
    То есть раньше кто как хотел, тот так свои уведомления и делал. Теперь всем стоит придерживаться конкретных стилей. Уведомления одного стиля плюс-минус одинаково выглядят для любого приложения.
    Надеюсь теперь пришло понимания, почему вам пытаются преподнести какую-то новую фичу, хотя вы точно знаете, что ещё несколько лет назад при получении картинки в Hangouts вы её видели в самом уведомлении и что могли прямо там нажать «Ответить»
 
MessagingStyle с чатом и
предустановленными ответами
    Начиная с Android 7.0 (API level 24) вы могли добавлять действия на ответы на сообщения или вводить текст ответа прямо в само уведомление. Android P расширяет эту фичу следующими возможностями:
  • Поддержка изображений: Android P показывает изображения в уведомлениях мессенджеров. Для этого используйте setData()
  • Упрощение поддержки участников чатов: для опознавания участников, включая их аватарки и URI используется новый класс Notification.Person. Много других API, к примеру addMessage(), теперь могут использовать класс Person вместо CharSequence
  • Сохранение ответов в черновиках: Ваше приложение может восстановить EXTRA_REMOTE_INPUT_DRAFT, отправляемое системой, когда пользователь случайно закрывает уведомление о сообщении. Вы можете использовать этот экстра для заполнения текстовых полей, чтобы пользователю осталось просто завершить фразу перед ответом.
  • Определение, является ли чат групповым: Вы можете использовать setGroupConversation() для точного задания, является чат групповым или не групповым
  • Установка смысловых действий для интента: Метод setSemanticAction() позволяет придать смысловое значение действию. Например «пометить как прочитанное», «удалить» и прочее. Прим. перев.: среди «другого» есть действия типа «поставить палец вверх» и «палец вниз». Лёгких дизлойсов, посоны!
  • SmartReply (предустановленные ответы): Android P поддерживает установку предлагаемых вариантов ответа из вашего приложения. Для этого передайте RemoteInput.setChoices() список стандартных ответов пользователя

Настройка каналов, бродкасты и Не беспокоить

    В Android O появились каналы уведомлений (Notification Channels), позволяющие вам создавать разные каналы для каждого типа уведомления, которые вы отображали пользователю, а пользователь мог настроить некоторых их поведения. Android P упрощает настройку каналов уведомлений благодаря следующим изменениям:
  • Блокировка каналов группами: Пользователь может заблокировать целиком группы каналов в настройках уведомлений приложения. Используя метод isBlocked() вы поймёте, заблокирована ли группа и, если да, просто не посылать никаких уведомлений для каналов в этих группах
    Кроме того, в приложении вы можете выполнить запрос для получения настроек группы, используя новый метод getNotificationChannelGroup()
  • Новые типы бродкаст интентов: Теперь Android будет посылать бродкасты интенты при блокировании каналов уведомлений или изменении групп. Приложение, которое владеет заблокированным каналом или группой, может слушать эти интенты и соответствующе на них реагировать. Для понимания, какие действия и экстра может быть в интентах, ознакомьтесь с обновлённым списком констант в NotificationManager
  • Новые категории режима Не беспокоить: NotificationManager.Policy получил две новых константы политик: PRIORITY_CATEGORY_ALARMS (разрешены будильники) и PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER (разрешены медиа, звуки системы и игр)

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

    Прим. перев.: до того, как читать этот параграф, нужно понять, что речь пойдёт не про уже существующие реализации взаимодействия с камерами, когда прошивка выбирает, на какую именно камеру сейчас сделать фото. К примеру, на широкоугольную или портретную (условно). Этот подход, по-сути, ничем бы не отличался от того, что было уже давно.
    Здесь речь пойдёт про то, что физические камеры могут быть объединены в одну логическую камеру и приложение будет работать с ней как с одной камерой, а система уже разрулит поведение между ними. Кроме того, физические камеры могут быть объеденены в одну логическую камеру с совершенно другими возможностями. К примеру, эта камера будет снимать в 3D, как это делал очень давно HTC EVO 3D.
    То есть API позволяет играть наборами камер, работая с ними раздельно, объединяя их в одну со специальными возможностями, которые сложно сделать программно или объединяя их так, что получится одна камера, но с целым диапазоном фокусных расстояний, которые будут.
 
    На устройствах под Android P вы можете получить доступ одновременно к двум и более физическим камерам. На устройствах с двумя фронтальными или задними камерами вы можете делать вещи, просто недоступные для устройств с одой камерой:  боке, стереоизображения, бесшовный зум. API позволяют вызвать поток логической или комбинированной камеры, который автоматически переключается между двумя и более камерами.

    Среди других улучшений в камере можно выделить новые параметры Session, которые помогают уменьшить задержки в снятии фотографий и Surface sharing, который позволяет приложениям камер управлять разными пользовательскими сценариями без необходимости останавливать и запускать потоки камер. Кроме того мы добавили API для поддержки вспышек, использующих дисплей и доступ к OIS таймштампам для стабилизации изображения на уровне приложения или, например, для накладывания специальных эффектов.

    Кроме того Android P поддерживает внешние USB/UVC камеры (прим. перев.: если кто не знает, то вот что такое UVC: https://en.wikipedia.org/wiki/USB_video_device_class/ Проще говоря, веб-камеру компа, в принципе, можно будет подключить как внешнее устройство вашего аппарата).

ImageDecoder для bitmaps и drawables

    Для современного подхода к декодированию изображений в Android P представлен ImageDecoder. Его использование при декодировании изображений предпочтительнее, чем API BitmapFactory и BitmapFactory.Options.

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

    Есть два метода, которыми вы можете задать свойства изображения:
  • Для подгон декодированного изображения под конкретный размер вызовите setResize() с нужными габаритами. Кроме того вы можете подогнать изображение под размер примера. Передайте размер примера напрямую в setResize() или же вызовите getSampledSize()
  • Для обрезки изображения до заданного диапазона подгона размеров, вызовите setCrop()
  • Для создания изменяемой Bitmap вызовите setMutable(true).
    Кроме того, ImageDecoder позволяет добавить к изображению как собственные, так и готовые эффекты, такие как скругления углов или круглые маски. Какой бы команду отрисовки вы ни хотели выполнить, используйте setPostProcessor() экземпляра класса PostProcessor. Когда вы закончите обработку AnimatedImageDrawable, эффекты будут применены ко всем кадрам.

Продолжение следует...

Комментариев нет:

Отправить комментарий