[Перевод] Портирование Android-приложения под Android TV и Nexus Player26.02.2015 11:48
Как уже писалось в блоге 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. Рисунок должен включать имя вашего приложения (если нужно, локализованное) и не иметь альфа-канала:
Все это позволит приложению быть видимым и запускаемым в 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, вам необходимо добавить скриншот и баннер:
И поставить нужную галочку, чтобы запросить распространение приложения на Android TV:
Оно будет проверено перед тем, как появится в Play Store, доступном для Android TV.
© Habrahabr.ru