Упрощение разработки Android TV за счет понимания различий и рекомендаций по кодированию для разработчиков мобильных приложений.

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

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

Планировки и виды:

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

Библиотека Leanback. Она включает в себя макеты, представления и виджеты, специально предназначенные для телевизоров, оптимизированные для больших экранов и дистанционного управления телевизионными устройствами. Вам необходимо включить следующую зависимость в файл build.gradle вашего приложения:

implementation 'androidx.leanback:leanback:1.2.0'

Эта библиотека предоставляет определенные макеты, такие как BrowseSupportFragment, RowSupportFragment и VerticalGridSupportFragment.

class MyBrowseFragment : BrowseSupportFragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        // Add your implementation code here
    }
}

Управление фокусом:

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

Нам следует использовать атрибут android:focusable="true", чтобы включить фокус на представлениях. Кроме того, обработку изменений фокуса можно выполнить с помощью интерфейса View.OnFocusChangeListener.

<Button
android:id="@+id/myButton"
android:focusable="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me" />

Чтобы реагировать на изменения фокуса представления, вы можете использовать интерфейс View.OnFocusChangeListener.

myButton.setOnFocusChangeListener(View.OnFocusChangeListener { v, hasFocus ->
    if (hasFocus) {
        // View has gained focus
        // Perform desired actions
    } else {
        // View has lost focus
        // Perform desired actions
    }
})

Вы можете определить порядок фокуса между представлениями, используя атрибуты android:nextFocusUp, android:nextFocusDown, android:nextFocusLeft и android:nextFocusRight в XML-файле макета.

<Button
android:id="@+id/button1"
android:focusable="true"
android:nextFocusDown="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 1" />

<Button
android:id="@+id/button2"
android:focusable="true"
android:nextFocusUp="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button 2" />

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

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true">
        <shape android:shape="rectangle">

            <solid android:color="#00529d" />
            <corners android:radius="3dp"/>
            <stroke android:width="2dp" android:color="#5d7fbf" />
        </shape>
    </item> <!-- focused -->
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="3dp"/>
            <solid android:color="#292929" />


        </shape>
    </item>
</selector>

Вы можете использовать этот рисуемый файл в любой кнопке или компоненте, установив для атрибута android:background значение @drawable/selector_button_bg. Например:

android:background="@drawable/selector_button_bg"

Обработка ввода:

Приложения Android TV в значительной степени полагаются на направленный ввод с пультов дистанционного управления или игровых контроллеров. Для обработки входного сигнала телевизора следует использовать события D-pad и соответствующие коды клавиш, например KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT и KEYCODE_DPAD_RIGHT.

class MainActivity : Activity() {
    // ...
    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        return when (keyCode) {
            KeyEvent.KEYCODE_DPAD_UP ->                
                 // Handle D-pad up event
                true
            KeyEvent.KEYCODE_DPAD_DOWN ->                
                 // Handle D-pad down event
                true
            KeyEvent.KEYCODE_DPAD_LEFT ->                
                 // Handle D-pad left event
                true
            KeyEvent.KEYCODE_DPAD_RIGHT ->                
                  // Handle D-pad right event
                true
            KeyEvent.KEYCODE_DPAD_CENTER ->              
                  // Handle D-pad center (select) event
                true
            else -> super.onKeyDown(keyCode, event)
        }
    }
}

Кроме того, вы также можете обрабатывать события крестовины с помощью метода onKey() dispatchKeyEvent()override, который обеспечивает большую гибкость при обработке пользовательских событий.

Манифест Android:

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

<activity
    android:name=".ui.main.MainActivity"
    android:exported="true"
    android:theme="@style/Theme.TorahClassAndroidTV.NoActionBar">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
    </intent-filter>
</activity>

Для приложений Android TV вам может потребоваться объявить определенные функции, связанные с телевизором, например android.hardware.touchscreen (установлено значение "false", чтобы указать отсутствие поддержки сенсорного экрана) и android.hardware.type.television (чтобы указать, что приложение предназначено для использования на телевидении). С другой стороны, мобильные приложения могут объявлять такие функции, как android.hardware.camera или android.hardware.location.

<uses-feature
    android:name="android.software.leanback"
    android:required="false" />

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

Разрешения и аппаратные возможности:

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

Например, устройства Android TV часто имеют встроенные ТВ-тюнеры, позволяющие пользователям смотреть прямые телетрансляции. Для доступа к функциям ТВ-тюнера и управления ими вашему приложению Android TV может потребоваться разрешение ACCESS_TV_TUNER.

Заключение:

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