Проект AndroidStudio, поддерживающий как Android, так и AndroidTV

Я пытаюсь создать проект AndroidStudio, который поддерживает как Android (телефон/планшет), так и AndroidTV. Цель состоит в том, чтобы иметь аналогичную функциональность на телефоне/планшете и AndroidTV, в то время как один не нуждается в другом для работы и повторно использует код.

Когда я создаю новый проект, я:

  • а) Поставить галочки как на "Телефон и планшет", так и на "Телевизор"?
  • b) Установите флажок «Телефон и планшет» и выполните модификацию на основе этого руководства: https://developer.android.com/training/tv/start/start.html
  • c) Отметьте «ТВ» и модернизируйте основное действие?

Я пробовал б), но и телефон (5.0), и ADT-1 получают одинаковую раскладку.

Ниже приведен мой файл манифеста (MainActivity помещается перед MainActivityTV). Когда я запускаю его, и телефон, и ADT-1 загружают макет телефона. Но когда я помещаю MainActivityTV перед MainActivity, и мой телефон, и ADT-1 загружают макет с наклоном назад. Как сделать так, чтобы телефон загружал только MainActivity, а ADT-1 загружал только MainActivityTV?

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

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:banner="@drawable/app_icon_your_company"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivityTV"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|navigation"
            android:theme="@style/Theme.Leanback">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".DetailsActivity" />
        <activity android:name=".PlaybackOverlayActivity" />
        <activity android:name=".BrowseErrorActivity" />
    </application>

</manifest>

person Gerard    schedule 27.02.2015    source источник
comment
Это, безусловно, поддерживаемая вещь, но вам потребуются отдельные действия для телевизора и телефона/планшета (библиотека телевизоров с наклоном назад плохо работает на телефоне/планшете и наоборот с темой Material). Можете ли вы опубликовать какой-нибудь код или как ваше приложение дает сбой?   -  person ianhanniballake    schedule 27.02.2015
comment
Я модернизировал свое пустое приложение для Android с помощью Android TV отсюда (developer.android.com/ training/tv/start/start.html). Нет ошибок. Но проблема в том, что и телефон, и телевизор загружают один и тот же макет. Кажется, первое действие, которое появляется в манифесте (выше), — это то, что отображается в обоих случаях. Спасибо.   -  person Gerard    schedule 28.02.2015


Ответы (2)


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

Прежде чем приступить к созданию приложений для ТВ, необходимо: Обновить инструменты SDK до версии 24.0.0 или выше. Обновленные инструменты SDK позволяют создавать и тестировать приложения для ТВ. Обновите SDK до Android 5.0 (API 21) или выше. Обновленная версия платформы предоставляет новые API для ТВ-приложений. Создайте или обновите проект приложения. Чтобы получить доступ к новым API для телевизионных устройств, необходимо создать проект или изменить существующий проект, предназначенный для Android 5.0 (уровень API 21) или выше.

  1. Объявить телевизионную активность

Приложение, предназначенное для работы на ТВ-устройствах, должно объявить действие запуска для ТВ в своем манифесте, используя CATEGORY_LEANBACK_LAUNCHER фильтр намерений. Этот фильтр определяет, что ваше приложение включено для ТВ, и требуется, чтобы ваше приложение считалось ТВ-приложением в Google Play. Объявление этого намерения также определяет, какое действие в вашем приложении должно запускаться, когда пользователь выбирает его значок на главном экране телевизора.

Если вы модифицируете существующее приложение для использования на телевизоре, ваше приложение не должно использовать тот же макет действий для телевизора, что и для телефонов и планшетов. Пользовательский интерфейс вашего ТВ-приложения (или ТВ-части вашего существующего приложения) должен обеспечивать более простой интерфейс, которым можно легко управлять с помощью пульта дистанционного управления с дивана. Рекомендации по разработке приложения для ТВ см. в Руководстве по дизайну ТВ. Дополнительные сведения о минимальных требованиях к реализации макетов интерфейса на ТВ см. в разделе Создание макетов ТВ.

В следующем фрагменте кода показано, как включить этот фильтр намерений в манифест:

<application
     android:banner="@drawable/banner" >
     ...
     <activity
          android:name="com.example.android.MainActivity"
          android:label="@string/app_name" >

          <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
     </activity> 

     <activity
          android:name="com.example.android.TvActivity"
          android:label="@string/app_name"
          android:theme="@style/Theme.Leanback">

          <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
               </intent-filter>
          </activity>
</application>
  1. Заявить о поддержке Leanback

Заявите, что ваше приложение использует пользовательский интерфейс Leanback, необходимый для Android TV. Если вы разрабатываете приложение, которое работает на мобильных устройствах (телефонах, носимых устройствах, планшетах и ​​т. д.), а также на Android TV, установите для требуемого атрибута значение false. Если вы установите для требуемого атрибута значение true, ваше приложение будет работать только на устройствах, использующих пользовательский интерфейс Leanback.

<manifest>
      <uses-feature android:name="android.software.leanback"
            android:required="false" />
       ...
</manifest>
  1. Объявить сенсорный экран не обязательным

В манифесте вашего ТВ-приложения должно быть указано, что функция android.hardware.touchscreen не требуется. Этот параметр указывает, что ваше приложение может работать на ТВ-устройстве, и требуется, чтобы ваше приложение считалось ТВ-приложением в Google Play. В следующем примере кода показано, как включить это объявление манифеста:

<manifest>
     <uses-feature android:name="android.hardware.touchscreen"
          android:required="false" />
     ...
</manifest>
  1. Предоставить баннер на главном экране

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

<application
      ...
      android:banner="@drawable/banner" >
      ...
</application>

Используйте атрибут android:banner с тегом, чтобы предоставить баннер по умолчанию для всех действий приложения, или с тегом, чтобы указать баннер для определенного действия.

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

  1. Добавить библиотеки поддержки ТВ

Android SDK включает библиотеки поддержки, предназначенные для использования с телевизионными приложениями. Эти библиотеки предоставляют API и виджеты пользовательского интерфейса для использования на телевизионных устройствах. Библиотеки находятся в каталоге /extras/android/support/. Вот список библиотек и их общее назначение:

  1. библиотека Leanback v17 — предоставляет виджеты пользовательского интерфейса для телевизионных приложений. , особенно для приложений, которые воспроизводят мультимедиа.
  2. библиотека v7 recyclerview – предоставляет классы для управления отображением длинных списки с эффективным использованием памяти. Несколько классов в библиотеке Leanback v17 зависят от классов в этой библиотеке.
  3. библиотека карт v7 – предоставляет виджеты пользовательского интерфейса для отображения информации. карточки, такие как изображения и описания мультимедийных элементов.
person pointNclick    schedule 28.02.2015
comment
Этот ответ верен в отношении документации, но все же у меня та же проблема, что и у @Gerard в начальном вопросе. Я использую Xamarin, но я не ожидаю, что это вызовет какое-либо поведение, отличное от Android Studio. - person Eivind Gussiås Løkseth; 23.06.2015

Вы можете сделать это, определив тип устройства, на котором вы работаете. Я бы сделал это в вашей MainActivity, проверив UImode, а затем запустив TVActivity, если он работает на телевизоре, как показано ниже.

uiMode = (UiModeManager) getSystemService(UI_MODE_SERVICE)
if(uiMode.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION){
    //then start TvActivity here
    ...
}
person CkurtM    schedule 22.09.2015