Press display on android

Беспроводной дисплей для Android

Многообразие функций и возможностей

О стандарте WiDi мы уже рассказывали достаточно: следили за новостями, рассматривали с точки зрения разработчика и даже тестировали живой серийный адаптер. Теперь для начала опишем в нескольких словах технологию Miracast.


Общая коцепция Miracast

Miracast представляет собой технологию передачи мультимедийной информации (аудио и видео) посредством WiFi. В качестве транспорта в нем используется стандарт WiFi Direct, позволяющий двум устройствам обмениваться данными друг с другом без помощи дополнительной сетевой инфраструктуры. Попросту говоря, Miracast можно представить, как беспроводной HDMI.
Miracast еще довольно молод: официальная сертификация Miracast устройств альянсом WiFi Alliance началась чуть более года назад. Для передачи видео используется кодек Н.264, звук может быть двух- или пятиканальным. Miracast является открытым стандартом, не принадлежащим какой-либо компании; его привлекательность еще более повысилась после того, как в прошлом году его поддержка была добавлена в ОС Android 4.2. Замечу сразу, что в Android 4.2 на конкретном устройстве не гарантируется наличие Miracast – это надо выяснять дополнительно. Полный список сертифицированных устройств- как передатчиков, так и приемников можно посмотреть на сайте WiFi Alliance.


Архитектура Miracast (со стороны передатчика)

Совместимость Miracast и WiDi версии 3.5 означает общность базового функционала в устройствах обоих стандартов. Какие дополнительные плюшки есть в WiDi, но отсутствуют в Miracast? На сей день их три:

  • обязательная поддержка HD видео вплоть до 1080p (хотя стандарт Miracast допускает высокое разрешение, но не обязывает все устройства поддерживать его);
  • поддержка системы защиты контента HDCP (High-bandwidth Digital Content Protection);
  • наличие двух дополнительных видео режимов – расширенного и многозадачного (о них чуть позже).

Таким образом, можно сказать, что WiDi в настоящее время является функциональным продолжением Miracast.
WiDi поддерживается большинством существующих мобильных платформ Intel (и наверняка будет поддерживаться последующими). Как уже отмечалось в тестировании, технология относится к разряду «однокнопочных», то есть предельно простых для пользователей.


Процесс подключения беспроводного дисплея на примере Samsung Galaxy S4

Ну а теперь пришло время поговорить о режимах. Нативным для WiDi/Miracast является Режим Клонирования – на удаленном дисплее отображается та же картинка, что и на локальном, с тем же разрешением.
Двойной режим также относится к основным; в нем на удаленном дисплее проигрывается контент, а основной служит для управления и вывода служебной информации. Данный режим поддерживается через Android Presentation API.
Расширенный режим имеется только в WiDi (и, соответственно, доступен только для устройств на платформе Intel Atom). В нем видео режим включается автоматически, когда пользователь запускает мультимедийный контент на плеере, использующим Android Media Player framework. Разрешение картинки остается «родным» вплоть до 1080р. При этом локальный рендеринг видео может отключаться для сокращения энергопотребления.
Наконец, самый продвинутый – Многозадачный Режим, при котором видео плеер посылает изображение на удаленный дисплей, а на локальном в это время пользователь делает, что хочет: просматривает интернет, принимает звонки или даже смотрит совсем другое видео, тоже в FullHD разрешении!

Варианты использования режима двух дисплеев:

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

  • просмотр интернет на большом экране (смартфон выступает в роли тачпада);
  • заполнение форм или набор небольших текстов (смартфон – сенсорная клавиатура);
  • игры (смартфон – сенсорный геймпад/джойстик);
  • мобильное рабочее место (смарфтон – компьютер, к нему по Bluetooth подключена периферия).
Читайте также:  Все телефоны с чистым андроидом


Создаем Android приложение для двух дисплеев

Поддержка второго беспроводного дисплея в Android 4.2 (API Level 17) реализована с помощью с помощью класса Presentation, позволяющего:

  • внедрить поддержку второго дисплея в приложения, не заботясь о способе, которым он будет физически подключен;
  • работать с MHL, HDMI, Slimport или Miracast совместимыми устройствами;
  • осуществлять управление вторым дисплеем независимо от первого.

Presentation является базовым классом и должен быть расширен:

Также необходима ассоциация с классом Display при создании. Presentation наследуется от Dialog, а что касается Dialog, то его жизненный цикл привязан к Activity.
Перед тем, как задействовать Presentation, вам необходимо выбрать дисплей, что может быть сделано двумя способами:
1. MediaRouter API (в API 16) – система сама выберет лучший дисплей за вас

2. Display Manager API (в API 17) – перечень дисплеев.

Добавление MediaRouteButton в приложение:

Как заставить Presentation API работать:

Далее, используя MediaRouter.addCallback, необходимо мониторить:

  • onRouteUnselected
  • onRouteSelected
  • onRoutePresentationDisplayChanged

А внутри активности, которая владеет Presentation:

  • onResume
  • onPause

API для управления WiFi дисплеями присутствуют внутри Android AOSP, но не являются частью Android framework. Параметры беспроводного дисплея могут быть вызваны через Intentandroid.settings.WIFI_DISPLAY_SETTINGS, но и он также не входит во фреймворк. Некоторые производители используют другие варианты: Samsung – com.samsung.wfd.LAUNCH_WFD_PICKER_DLG, HTC – com.htc.wifidisplay.CONFIGURE_MODE_NORMAL.
Все API, приведенные на рисунке ниже, являются внутренними для Android 4.2/4.3. Они являются частью AOSP и распространяются свободно, однако не входят во фреймворки и работать не обязаны.

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

При подготовке поста использовались материалы IDF 2013, авторы — Xavier Hallade и Costas Stylianou.

Источник

Экран

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

Настройки — Экран

Чтобы показать окно Экран из системного приложения Настройки:

Размеры экрана и его ориентация (Старый и новый способ)

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

Данный способ был опубликован в те времена, когда у меня был Android 2.3. Читатели подсказали, что теперь методы считаются устаревшими (API 13 и выше). Пришлось переписывать код. Впрочем, спустя некоторое время и этот код стал считаться устаревшим.

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

Плотность экрана, масштабирование шрифта и др.

Существует класс DisplayMetrics, также имеющий в своём составе свойства для экрана. Пример также пришлось переписывать после выхода Android 11 (API 30), который теперь тоже устаревший:

Вот ещё несколько способов определения размеров:

Такой же код, но с использованием дополнительной константы SCREENLAYOUT_SIZE_MASK:

На Kotlin в виде отдельной функции.

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

Получить текущее значение яркости экрана

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

Установить яркость экрана

Если можно получить значение текущей яркости экрана, значит можно и установить яркость. Для начала нужно установить разрешение на изменение настроек в манифесте:

Для настройки яркости нужно использовать параметр System.SCREEN_BRIGHTNESS. Добавим на форму кнопку, метку и ползунок. Код для установки яркости:

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

Читайте также:  Что такое mobogenie для андроид

Далее программа должна проверить возможность изменять системные настройки через метод canWrite(). Если такая возможность есть, то запрашиваем разрешение. Появится специальное окно, в котором пользователь должен подтвердить своё решение через переключатель. После этого нужно заново запустить программу, чтобы ползунок стал доступен. Теперь можете менять настройки.

Настраиваем яркость экрана в своём приложении

Существует возможность переопределить яркость экрана в пределах своего приложения. Я не смог придумать, где можно найти практическое применение, но вдруг вам пригодится. Для управления яркостью экрана воспользуемся элементом SeekBar.

За яркость экрана отвечает свойство LayoutParams.screenBrightness:

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

Опять столкнулся с проблемой. Пример работал на старых устройствах, а на некоторых устройства не работает. Но за эти годы мне ни разу не пришлось использовать этот способ, поэтому даже не стал искать причину. И кстати, ошибка со значением 0 уже не возникает (возможно из-за того, что сам пример не работает как раньше).

Определение поддерживаемых экранных размеров в манифесте

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

В данном примере приводится поддержка нормальных и больших экранов. Маленьким экраном можно назвать любой дисплей с разрешением меньше, чем HVGA. Под большим экраном подразумевается такой, который значительно больше, чем у смартфона (например, у планшетов). Экран нормальных размеров имеет большинство смартфонов.

Атрибут anyDensity говорит о том, каким образом ваше приложение будет масштабироваться при отображении на устройствах с разной плотностью пикселов. Если вы учитываете это свойство экрана в своем интерфейсе, установите этому атрибуту значение true. При значении false Android будет использовать режим совместимости, пытаясь корректно масштабировать пользовательский интерфейс приложения. Как правило, это снижает качество изображения и приводит к артефактам при масштабировании. Для приложений, собранных с помощью SDK с API level 4 и выше, этот атрибут по умолчанию имеет значение true.

Размеры картинок для фона экрана

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

res/drawable-ldpi — 240×320
res/drawable-mdpi — 320×480
res/drawable-hdpi — 480×800
res/drawable-xhdpi — 640×960
res/drawable-xxhdpi — 960×1440
res/drawable-tvdpi — 1.33 * mdpi

Источник

Беспроводной дисплей для Android

Многообразие функций и возможностей

О стандарте WiDi мы уже рассказывали достаточно: следили за новостями, рассматривали с точки зрения разработчика и даже тестировали живой серийный адаптер. Теперь для начала опишем в нескольких словах технологию Miracast.


Общая коцепция Miracast

Miracast представляет собой технологию передачи мультимедийной информации (аудио и видео) посредством WiFi. В качестве транспорта в нем используется стандарт WiFi Direct, позволяющий двум устройствам обмениваться данными друг с другом без помощи дополнительной сетевой инфраструктуры. Попросту говоря, Miracast можно представить, как беспроводной HDMI.
Miracast еще довольно молод: официальная сертификация Miracast устройств альянсом WiFi Alliance началась чуть более года назад. Для передачи видео используется кодек Н.264, звук может быть двух- или пятиканальным. Miracast является открытым стандартом, не принадлежащим какой-либо компании; его привлекательность еще более повысилась после того, как в прошлом году его поддержка была добавлена в ОС Android 4.2. Замечу сразу, что в Android 4.2 на конкретном устройстве не гарантируется наличие Miracast – это надо выяснять дополнительно. Полный список сертифицированных устройств- как передатчиков, так и приемников можно посмотреть на сайте WiFi Alliance.


Архитектура Miracast (со стороны передатчика)

Совместимость Miracast и WiDi версии 3.5 означает общность базового функционала в устройствах обоих стандартов. Какие дополнительные плюшки есть в WiDi, но отсутствуют в Miracast? На сей день их три:

  • обязательная поддержка HD видео вплоть до 1080p (хотя стандарт Miracast допускает высокое разрешение, но не обязывает все устройства поддерживать его);
  • поддержка системы защиты контента HDCP (High-bandwidth Digital Content Protection);
  • наличие двух дополнительных видео режимов – расширенного и многозадачного (о них чуть позже).
Читайте также:  Не отправляются сообщения вайбер андроид

Таким образом, можно сказать, что WiDi в настоящее время является функциональным продолжением Miracast.
WiDi поддерживается большинством существующих мобильных платформ Intel (и наверняка будет поддерживаться последующими). Как уже отмечалось в тестировании, технология относится к разряду «однокнопочных», то есть предельно простых для пользователей.


Процесс подключения беспроводного дисплея на примере Samsung Galaxy S4

Ну а теперь пришло время поговорить о режимах. Нативным для WiDi/Miracast является Режим Клонирования – на удаленном дисплее отображается та же картинка, что и на локальном, с тем же разрешением.
Двойной режим также относится к основным; в нем на удаленном дисплее проигрывается контент, а основной служит для управления и вывода служебной информации. Данный режим поддерживается через Android Presentation API.
Расширенный режим имеется только в WiDi (и, соответственно, доступен только для устройств на платформе Intel Atom). В нем видео режим включается автоматически, когда пользователь запускает мультимедийный контент на плеере, использующим Android Media Player framework. Разрешение картинки остается «родным» вплоть до 1080р. При этом локальный рендеринг видео может отключаться для сокращения энергопотребления.
Наконец, самый продвинутый – Многозадачный Режим, при котором видео плеер посылает изображение на удаленный дисплей, а на локальном в это время пользователь делает, что хочет: просматривает интернет, принимает звонки или даже смотрит совсем другое видео, тоже в FullHD разрешении!

Варианты использования режима двух дисплеев:

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

  • просмотр интернет на большом экране (смартфон выступает в роли тачпада);
  • заполнение форм или набор небольших текстов (смартфон – сенсорная клавиатура);
  • игры (смартфон – сенсорный геймпад/джойстик);
  • мобильное рабочее место (смарфтон – компьютер, к нему по Bluetooth подключена периферия).


Создаем Android приложение для двух дисплеев

Поддержка второго беспроводного дисплея в Android 4.2 (API Level 17) реализована с помощью с помощью класса Presentation, позволяющего:

  • внедрить поддержку второго дисплея в приложения, не заботясь о способе, которым он будет физически подключен;
  • работать с MHL, HDMI, Slimport или Miracast совместимыми устройствами;
  • осуществлять управление вторым дисплеем независимо от первого.

Presentation является базовым классом и должен быть расширен:

Также необходима ассоциация с классом Display при создании. Presentation наследуется от Dialog, а что касается Dialog, то его жизненный цикл привязан к Activity.
Перед тем, как задействовать Presentation, вам необходимо выбрать дисплей, что может быть сделано двумя способами:
1. MediaRouter API (в API 16) – система сама выберет лучший дисплей за вас

2. Display Manager API (в API 17) – перечень дисплеев.

Добавление MediaRouteButton в приложение:

Как заставить Presentation API работать:

Далее, используя MediaRouter.addCallback, необходимо мониторить:

  • onRouteUnselected
  • onRouteSelected
  • onRoutePresentationDisplayChanged

А внутри активности, которая владеет Presentation:

  • onResume
  • onPause

API для управления WiFi дисплеями присутствуют внутри Android AOSP, но не являются частью Android framework. Параметры беспроводного дисплея могут быть вызваны через Intentandroid.settings.WIFI_DISPLAY_SETTINGS, но и он также не входит во фреймворк. Некоторые производители используют другие варианты: Samsung – com.samsung.wfd.LAUNCH_WFD_PICKER_DLG, HTC – com.htc.wifidisplay.CONFIGURE_MODE_NORMAL.
Все API, приведенные на рисунке ниже, являются внутренними для Android 4.2/4.3. Они являются частью AOSP и распространяются свободно, однако не входят во фреймворки и работать не обязаны.

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

При подготовке поста использовались материалы IDF 2013, авторы — Xavier Hallade и Costas Stylianou.

Источник

Оцените статью