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

в 7:13, , рубрики: Android TV, Nexus Player, Блог компании Intel, Программирование, разработка, Разработка под android, метки: ,

Портирование Android-приложения под Android TV и Nexus Player - 1
Как уже писалось в блоге 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:
<activity
            android:name=".TvMainActivity"
            android:banner="@drawable/ic_banner"
            android:theme="@style/TvAppTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
</activity>

Замечание. В Leanback Launcher имеется две категории приложений: Apps and Games. Если вы хотите появиться в списке игр, вам нужно присвоить свойству isGame значение true:

AndroidManifest.xml:
<application>
  ...
  android:isGame="true"
  ...>

Сверху конкретного intent фильтра, также находящегося в этой activity, имеется свойство android:banner, определяющее баннер, которое будет отображаться в лончере. Баннер представляет собой рисунок размером 320х180 пикселей, который должен быть помещен в папку ресурсов drawable-xhdpi. Рисунок должен включать имя вашего приложения (если нужно, локализованное) и не иметь альфа-канала:

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

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

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

my_activity.xml:
<View android:id="@+id/my_view" android:focusable="true" >
      <requestFocus />
</View>

Свойство android:focusable должно иметь значение true, если вы хотите, чтобы запрос фокуса работал при увеличении представления.

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

my_activity.xml:
<View 
    android:nextFocusDown="@id/bottom_view"
    android:nextFocusUp="@id/top_view"
    android:nextFocusLeft="@id/left_view"
    android:nextFocusRight="@id/right_view"
/>

Раз навигация с помощью D-pad работает в вашем приложении, вы можете объявить ее в AndroidManifest.xml. Просто объявите, что сенсорные возможности нам не требуются:

<uses-feature
    android:name="android.hardware.touchscreen"
    android:required="false" />

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

Оформление приложения не должно содержать строки меню и панели инструментов (даже если строка меню работает с D-pad, это определенно плохая идея с точки зрения юзабилити). Две темы оформления, которые вы можете использовать – это Theme.Leanback из библиотеки поддержки Leanback и android:Theme.NoTitleBar. Эти темы не включают в себя каемки по краям экрана, поэтому их следует добавить дополнительно. Заметьте, что в элементы Leanback поля уже включены.

<LinearLayout
...
    android:layout_marginTop="27dp"
    android:layout_marginLeft="48dp"
    android:layout_marginRight="48dp"
    android:layout_marginBottom="27dp"
...>

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

AndroidManifest.xml:
<manifest 
    xmlns:tools="http://schemas.android.com/tools"
    ...>

    <uses-sdk tools:overrideLibrary="android.support.v17.leanback" />
   ...

Посмотрите пример использования библиотеки поддержки Leanback. Я также советую прочитать хорошую вводную статью авторства Sebastiano Gottardo (musixMatch).

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

<uses-feature 
    android:name="android.hardware.gamepad"
    android:required="false" />

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

Изучить разнообразные игровые контроллеры можно на этом тренинге.

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

AndroidManifest.xml:
<uses-feature android:name="android.software.leanback"
        android:required="true" />

При значении 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:

<uses-feature
    android:name="android.hardware.screen.portrait"
    android:required="false" />

То же самое необходимо для:

  • 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-приложения под Android TV и Nexus Player - 3

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

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

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

Автор: saul

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js