8

我正在尝试创建一个同时支持 Android(手机/平板电脑)和 AndroidTV 的 AndroidStudio 项目。目标是在手机/平板电脑和 AndroidTV 上拥有类似的功能,而一个不需要另一个操作,并重用代码。

当我创建一个新项目时,我是否:

我试过 b) 但手机 (5.0) 和 ADT-1 的布局相同。

下面是我的清单文件(MainActivity 放在 MainActivityTV 之前)。当我运行它时,电话和 ADT-1 都会加载电话布局。但是,当我将 MainActivityTV 放在 MainActivity 之前时,我的手机和 ADT-1 都会加载leanback 布局。如何让手机只加载 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>
4

2 回答 2

6

是的,手机/平板电脑和 Android TV 应用程序可以有一个 APK 文件,因为 TV 应用程序使用与手机和平板电脑相同的结构。这种相似性意味着您可以修改现有应用程序,使其也可以在电视设备上运行,或者根据您已经了解的为 Android 构建应用程序创建新应用程序。

在开始为电视构建应用程序之前,您必须: 将您的 SDK 工具更新到 24.0.0 或更高版本。更新后的 SDK 工具使您能够构建和测试适用于电视的应用程序。使用 Android 5.0 (API 21) 或更高版本更新您的 SDK。更新的平台版本为电视应用程序提供了新的 API。创建或更新您的应用项目。为了访问电视设备的新 API,您必须创建一个项目或修改一个面向 Android 5.0(API 级别 21)或更高版本的现有项目。

  1. 声明电视活动

打算在电视设备上运行的应用程序必须使用CATEGORY_LEANBACK_LAUNCHER意图过滤器在其清单中声明电视的启动器活动。此过滤器将您的应用识别为已启用电视,并且您的应用需要在 Google Play 中被视为电视应用。声明此意图还可以确定当用户在电视主屏幕上选择其图标时要在您的应用中启动哪个 Activity。

如果您正在修改现有应用以在电视上使用,则您的应用不应在电视上使用与手机和平板电脑相同的活动布局。您的电视应用程序(或现有应用程序的电视部分)的用户界面应提供更简单的界面,可以使用沙发上的遥控器轻松导航。有关为电视设计应用程序的指南,请参阅电视设计指南。有关 TV 界面布局的最低实现要求的更多信息,请参阅构建 TV 布局。

以下代码片段显示了如何在清单中包含此意图过滤器:

<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 支持

声明您的应用使用 Android TV 所需的 Leanback 用户界面。如果您正在开发在移动设备(手机、可穿戴设备、平板电脑等)以及 Android TV 上运行的应用程序,请将所需的属性值设置为 false。如果您将 required 属性值设置为 true,您的应用将仅在使用 Leanback UI 的设备上运行。

<manifest>
      <uses-feature android:name="android.software.leanback"
            android:required="false" />
       ...
</manifest>
  1. 声明不需要触摸屏

您的 TV 应用程序清单必须声明不需要 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 属性为所有应用程序活动提供默认横幅,或使用标签为特定活动提供横幅。

请参阅UI Patterns for TV 设计指南中的横幅

  1. 添加电视支持库

Android SDK 包括旨在与电视应用程序一起使用的支持库。这些库提供用于电视设备的 API 和用户界面小部件。这些库位于/extras/android/support/ 目录中。以下是这些库及其一般用途的列表:

  1. v17 leanback 库- 为电视应用程序提供用户界面小部件,特别是为进行媒体播放的应用程序。
  2. v7 recyclerview 库- 提供用于以内存有效方式管理长列表显示的类。v17 leanback 库中的几个类依赖于该库中的类。
  3. v7 cardview library - 提供用于显示信息卡片的用户界面小部件,例如媒体项目图片和描述。
于 2015-02-28T02:39:42.827 回答
1

您可以通过检测您运行的设备类型来做到这一点。我会在您的 MainActivity 中执行此操作,方法是检查 UImode,然后启动 TVActivity(如果它在 Tv 上运行,如下所示)

uiMode = (UiModeManager) getSystemService(UI_MODE_SERVICE)
if(uiMode.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION){
    //then start TvActivity here
    ...
}
于 2015-09-22T13:00:24.697 回答