[Перевод] Портирование Android-приложения под Android TV и Nexus Player

e77f477eb59e412c9b8e23c8f839aef7.jpgКак уже писалось в блоге Intel, в конце прошлого года Google выпустила новый Nexus Player на базе процессора Intel Atom. В этой статье вы найдете советы, как адаптировать свое Android-приложение для данного устройства в частности и Android TV вообще.Если вы хотите, чтобы ваше приложение было доступным для устройств Android TV и виделось их загрузчиком, необходимо, во-первых, предоставить activity, которая будет обрабатывать intent action.Main для категории LEANBACK_LAUNCHER, во-вторых, добавить ресурсы, специфичные для ТВ и, в-третьих, указать, что вашему приложению не требуется сенсорный дисплей. Как видите, все очень просто. Теперь давайте посмотрим, как это выглядит на практике.Как и классический загрузчик Android, загрузчик Android TV будет искать activity вашего приложения, которую вы задали в android.intent.action.MAIN intent. Но в случае загрузчика Android TV, категория intent будет не android.intent.category.LAUNCHER, а android.intent.category.LEANBACK_LAUNCHER.

Вот как вы должны объявить Main Activity вашего приложения для Android TV:

AndroidManifest.xml: Замечание. В Leanback Launcher имеется две категории приложений: Apps and Games. Если вы хотите появиться в списке игр, вам нужно присвоить свойству isGame значение true: AndroidManifest.xml: … android: isGame=«true» …> Сверху конкретного intent фильтра, также находящегося в этой activity, имеется свойство android: banner, определяющее баннер, которое будет отображаться в лончере. Баннер представляет собой рисунок размером 320×180 пикселей, который должен быть помещен в папку ресурсов drawable-xhdpi. Рисунок должен включать имя вашего приложения (если нужно, локализованное) и не иметь альфа-канала: 84c1fbed9d8541a784a538c2b4d55d7e.png

Все это позволит приложению быть видимым и запускаемым в Android TV лончере.

Однако для того, чтобы приложение было совместимым с Android TV, вам также нужно обеспечить и задекларировать поддержку Android-устройств без сенсорного дисплея. Первым делом необходимо внедрить поддержку навигации с помощью кнопки-крестовины (D-pad). Стандартные элементы интерфейса Android сами по себе ее поддерживают, но на практике требуется некоторая настройка.Укажите элемент, на который будет направлен изначальный фокус в вашем представлении с помощью requestFocus () в Java или  в XML разметке:

my_activity.xml: Свойство android: focusable должно иметь значение true, если вы хотите, чтобы запрос фокуса работал при увеличении представления.Иногда необходимо настроить навигацию внутри представления. Вы можете выбрать, как фокус будет перемещаться от одного элемента к другому с использованием свойства nextFocus:

my_activity.xml: Раз навигация с помощью D-pad работает в вашем приложении, вы можете объявить ее в AndroidManifest.xml. Просто объявите, что сенсорные возможности нам не требуются: Выполнения указанных выше требований достаточно, чтобы ваше приложение устанавливалось и запускалось на Android TV. Поговорим теперь немного об удобстве его использования.Оформление приложения не должно содержать строки меню и панели инструментов (даже если строка меню работает с D-pad, это определенно плохая идея с точки зрения юзабилити). Две темы оформления, которые вы можете использовать — это Theme.Leanback из библиотеки поддержки Leanback и android: Theme.NoTitleBar. Эти темы не включают в себя каемки по краям экрана, поэтому их следует добавить дополнительно. Заметьте, что в элементы Leanback поля уже включены.

Библиотека поддержки Leanback доступна начиная с API Level 17 и содержит готовые к использованию элементы и темы для приложений. Если вы планируете поддерживать более ранние версии API, можно хранить все ссылки на темы и элементы Leanback в специфической для TV части приложения и далее воспользоваться функцией слияния манифестов gradle, чтобы избежать апгрейда minSdkVersion: AndroidManifest.xml:

… Посмотрите пример использования библиотеки поддержки Leanback. Я также советую прочитать хорошую вводную статью авторства Sebastiano Gottardo (musixMatch).Игры Android TV могут быть значительно улучшены путем добавления режима мультиплеера и поддержки геймпада. В манифесте можно указать, что игра поддерживает геймпад:

Установите эту опцию в качестве требуемой (required) только в том случае, если геймпад обязателен для вашего приложения; помните, что в комплект устройств типа Nexus Player он не входит. В качестве контроллеров могут быть использованы дополнительные Android-устройства, но на сегодняшний момент они могут выступать только в качестве D-pad.Изучить разнообразные игровые контроллеры можно на этом тренинге.

Блок рекомендаций занимает половину места в лончере, чтобы появиться там, пошлите уведомление с установленной категорией «recommendation», как описано в официальном тренинге.С помощью системы фильтрации по функционалу в Play Store вы можете ограничить распространение вашего приложения только Android TV совместимыми устройствами, установив нужное значение android.software.leanback:

AndroidManifest.xml: При значении required, ваше приложение будет доступно только Android TV совместимым устройствам.Вы можете распространять ваше приложение как отдельную позицию в Play Store, также есть вариант загрузить его как TV-версию существующего приложения, воспользовавшись функцией множественные APK в Play Store. Во втором случае TV-версия должна иметь другой versionCode, нежели классическое приложение.Nexus Player представляет собой полностью 64-битную платформу и ядро системы, конечно, также 64-битное, однако юзерспейс остается на сегодняшний день х86 32-битным. На устройстве можно спокойно запустить скомпилированный под ARM код, но лучше использовать х86 бинарники. Об аспектах совместимости для х86 устройств можно прочитать в моей предыдущей статье.

Краткое изложение принципов программирования под Android TV вы найдете на сайте Android-разработчиков.Если в любом activity вашего приложения указано android: screenOrientation=«portrait», свойству android.hardware.screen.portrait будет принудительно присвоено значение true. Вам необходимо принудительно переопределить его в false, чтобы ваше приложение было доступным для устройств Android TV:

То же самое необходимо для: android.hardware.location.android.permission.ACCESS_FINE_LOCATION android.hardware.camera.autofocus и android.hardware.camera, имплицированного android.permission.CAMERA android.hardware.microphone, имплицированного android.permission.RECORD_AUDIO android.hardware.telephony, имплицированного различными телефонными разрешениями Когда ваше приложение готово и АРК загружено на страничку разработчика Play Store, вам необходимо добавить скриншот и баннер: f41064d36dcb4835abe8c78f0390079d.png

И поставить нужную галочку, чтобы запросить распространение приложения на Android TV:

e3d97a94eac743cc8d1b02f4ea0ef71f.png

Оно будет проверено перед тем, как появится в Play Store, доступном для Android TV.

© Habrahabr.ru