google翻译[https://www.jianshu.com/p/c216849986ed]

Ⅰ。开始使用电视应用

为了使您的应用在电视设备上获得成功,您必须设计出可以在10英尺远的地方轻松理解的新布局,并提供仅使用方向键和选择按钮即可进行导航的功能。

确定媒体格式支持

先决条件

宣布电视活动

打算在电视设备上运行的应用程序必须在清单中声明电视的启动器活动。它使用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>

在此示例中,第二个活动清单条目将该活动指定为要在电视设备上启动的活动。

Caution: If you do not include the CATEGORY_LEANBACK_LAUNCHER intent filter in your app, it is not visible to users running Google Play on TV devices. Also, if your app does not have this filter when you use developer tools to load it onto a TV device, the app does not appear in the TV user interface.

如果您要修改现有的应用程序以在电视上使用,则您的应用程序不应在电视上使用与手机和平板电脑相同的活动布局。电视应用程序的用户界面(或现有应用程序的电视部分)应提供更简单的界面,以便使用沙发上的遥控器轻松导航。

声明Leanback支持

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

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

无需声明触摸屏

旨在在电视设备上运行的应用程序不依赖于触摸屏进行输入。为了清楚起见,您的电视应用程序清单必须声明不需要android.hardware.touchscreen功能。此设置将您的应用标识为可以在电视设备上运行,并且在Google Play中将其视为电视应用是必需的。下面的代码示例演示如何包含此清单声明:

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

提供主屏幕横幅

如果应用程序包括Leanback启动器意图过滤器,则它必须为每个本地化提供主屏幕横幅图像。标语是在应用程序和游戏行的主屏幕上显示的应用程序启动点。要将横幅添加到您的应用程序,请在清单中描述横幅,如下所示:

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

android:banner属性与<application>标记一起使用可为所有应用程序活动提供默认横幅,或与<activity>标记一起使用可为特定活动提供横幅。

标语应该是大小为320 x 180像素的xhdpi资源。图像中必须包含文本。如果您的应用程序支持多种语言,则必须为横幅广告提供单独的版本,并为每种受支持的语言提供文字。

更改启动器颜色

启动电视应用程序时,系统会显示一个类似于扩大的实心圆的动画。要自定义此动画的颜色,请将电视应用或活动的android:colorPrimary属性设置为特定颜色。您还应该将两个其他过渡重叠属性设置为true,如主题资源XML文件中的以下片段所示:

<resources>
    <style ... >
      <item name="android:colorPrimary">@color/primary</item>
      <item name="android:windowAllowReturnTransitionOverlap">true</item>
      <item name="android:windowAllowEnterTransitionOverlap">true</item>
    </style>
</resources>

添加电视支持库

  • v17 leanback库 -为电视应用程序提供用户界面小部件,特别是对于执行媒体播放的应用程序。
  • v7 recyclerview库 -提供用于以节省内存的方式管理长列表显示的类。v17 leanback库中的几个类取决于此库中的类。
  • v7 Cardview库 -提供用于显示信息卡(如媒体项目图片和说明)的用户界面小部件。
    Note: You are not required to use these support libraries for your TV app. However, we strongly recommend using them, particularly for apps that provide a media catalog browsing interface.
    如果您决定对您的应用程序使用v17 leanback库,则应注意它取决于 v4支持库。因此,使用leanback支持库的应用程序必须包括以下支持库:
  • v4支持库
  • v7 recyclerview支持库
  • v17 leanback支持库
  • 构建电视播放应用程序 -电视是为了娱乐而构建的,因此Android提供了一组用户界面工具和小部件,用于构建可播放视频和音乐并允许用户浏览所需内容的电视应用程序。
  • 帮助用户在电视上找到您的内容 -触手可及的所有内容选择,帮助他们找到自己喜欢的内容几乎与提供该内容一样重要。本培训讨论如何在电视设备上显示内容。

运行电视应用

在真实设备上运行

1.使用USB电缆将电视设备连接到开发机。如果需要,请参阅设备制造商提供的文档。
2.在电视设备上,导航至设置。
3.在设备行中,选择关于。
4.向下滚动至“生成”,然后选择“生成”几次,直到出现消息“您现在是开发人员!”。
5.返回设置。在“首选项”行中,选择“开发人员选项”。
6.选择调试> USB调试,然后选择打开。
7.导航回到电视主屏幕。

在虚拟设备上运行

  1. 启动AVD管理器。有关更多信息,请参见AVD Manager帮助。
  2. 在“ AVD管理器”对话框中,单击“ 设备定义”选项卡。
  3. 选择一个Android TV设备定义,然后单击创建AVD
  4. 选择仿真器选项,然后单击“ 确定”以创建AVD。

二,处理电视硬件

电视硬件与其他Android设备有很大不同。电视不包括其他Android设备上的某些硬件功能,例如触摸屏,相机和GPS接收器。电视也完全依赖于辅助硬件设备。为了使用户与电视应用程序进行交互,他们必须使用遥控器或游戏板。为电视构建应用程序时,必须仔细考虑硬件限制和在电视硬件上运行的要求。

声明电视的硬件要求

Android应用程序可以在应用清单中声明硬件功能要求,以确保不会在未提供这些功能的设备上安装它们。如果您要扩展现有的应用程序以在电视上使用,请仔细检查您的应用程序清单,了解是否有任何硬件要求声明,这些声明可能会阻止将其安装在电视设备上

<uses-feature android:name="android.hardware.touchscreen"
        android:required="false"/>
<uses-feature android:name="android.hardware.faketouch"
        android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
        android:required="false"/>
<uses-feature android:name="android.hardware.camera"
        android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
        android:required="false"/>
<uses-feature android:name="android.hardware.location.gps"
        android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
        android:required="false"/>
<uses-feature android:name="android.hardware.sensor"

**Note:** Some features have subfeatures like *android.hardware.camera.front*, as described in the [Feature reference](https://developer.android.google.cn/guide/topics/manifest/uses-feature-element.html#features-reference). Be sure to mark as *required="false"* any subfeatures also used in your app.
Caution: Declaring a hardware feature as required by setting its value to true prevents your app from being installed on TV devices or appearing in the Android TV home screen launcher.

低功耗模式下暂停播放

当用户关闭设备时,某些电视设备支持低功耗模式。该设备没有关闭电源,而是禁用了显示功能,并使Android TV在后台运行。在此模式下仍会启用音频输出,因此当设备处于低功耗模式时,您的应用应停止当前正在播放的任何内容。

为避免在低功耗模式下播放,请覆盖[onStop()](https://developer.android.google.cn/reference/android/app/Activity.html#onStop())并停止任何当前播放的内容:

@Override
public void onStop() {
  // App-specific method to stop playback
  stopPlayback();
  super.onStop();
}

Ⅲ。手柄控制器断开

电视控制器通常是蓝牙设备,可能会通过定期进入睡眠模式并与电视设备断开连接来尝试节省电量。这意味着如果未将应用程序配置为处理这些重新连接事件,则该应用程序可能会中断或重新启动。这些事件可能在以下任何情况下发生:

在观看长达几分钟的视频时,D-Pad或游戏控制器进入睡眠模式,与电视设备断开连接,然后稍后重新连接。
在玩游戏的过程中,新玩家使用当前未连接的游戏控制器加入游戏。
在玩游戏期间,玩家离开游戏并断开游戏控制器的连接。
必须将受断开连接和重新连接事件影响的任何TV应用程序活动配置为处理应用清单中的重新连接事件。以下代码示例演示了如何使活动能够处理配置更改,包括键盘或导航设备的连接,断开或重新连接:

<activity
  android:name="com.example.android.TvActivity"
  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>

通过此配置更改,应用程序可以通过重新连接事件继续运行,而不是通过Android框架重新启动,这不是良好的用户体验。

处理按钮事件

当用户单击控制器上的按钮时,您的应用程序会收到一个带有KeyEvent的事件。该按钮的预期行为可能是媒体事件(例如播放,暂停或停止),也可能是电视类型的事件(例如选择或导航)。为了提供良好的用户体验,您的应用应为控制器按钮分配一致的行为。

电视用户界面事件

生成这些KeyEvent的按钮应由应用根据下表处理。

按键事件行为
BUTTON_B,返回背部
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTER选拔
DPAD_UP,DPAD_DOWN,DPAD_LEFT,DPAD_RIGHT导航

媒体活动

当用户观看媒体时,应根据下表由应用处理生成这些KeyEvent的按钮。如果您的应用正在控制MediaSession,则应调用TransportControls以下方法之一。请注意,在这种情况下,选择按钮充当“播放/暂停”按钮。

按键事件TransportControls呼叫行为
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTERpause()
BUTTON_START,BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTERpause()暂停
BUTTON_R1skipToNext()跳到下一个
BUTTON_L1skipToPrevious()跳到上一个
DPAD_RIGHT,BUTTON_R2,AXIS_RTRIGGER,AXIS_THROTTLEfastForward()快进
DPAD_LEFT,BUTTON_L2,AXIS_LTRIGGER,AXIS_BRAKErewind()倒带
没有KeyEvent与Stop关联)stop()停止

四,电视的布局

通常从大约10英尺远的地方观看电视屏幕,尽管它比大多数其他Android设备显示屏大得多,但这种类型的屏幕无法提供与较小设备相同的精确细节和色彩。这些因素要求您在考虑电视设备的情况下创建应用布局,以便创建有用且令人愉快的用户体验。

在电视上使用布局主题

瘦背主题

V17的Leanback支持库包括Theme.Leanback,电视活动,提供了一个一致的视觉风格的主题。我们强烈建议在使用v17 leanback类构建的任何电视应用中使用此主题。以下代码示例显示如何将此主题应用于活动:

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

**Caution:**后倾主题不包括操作栏,因为Android TV应用程序中没有。如果您的应用程序使用支持片段,例如BrowseSupportFragment,则您的活动必须扩展FragmentActivity。不要使用试图使操作栏主题化并产生错误的AppCompatActivity

java.lang.RuntimeException: Unable to start activity ComponentInfo{...} :
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this
activity.

NoTitleBar主题

标题栏是手机和平板电脑上的Android应用程序的标准用户界面元素,但不适用于电视应用程序。如果您不使用v17 leanback类,则应将此主题应用于电视活动,以禁止显示标题栏。电视应用清单中的以下代码示例演示了如何应用此主题来删除标题栏的显示:

<application>
  ...

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

  </activity>
</application>

建立基本的电视版面

电视设备的布局应遵循一些基本准则,以确保它们在大屏幕上可用并有效。请遵循以下提示,以构建针对电视屏幕优化的景观布局:

  • 以横向放置布局。电视屏幕始终以横向模式显示。
  • 将屏幕上的导航控件放在屏幕的左侧或右侧,并保留内容的垂直空间。
  • 使用Fragments创建分为几部分的UI ,并使用GridView之类的视图组代替ListView来更好地利用水平屏幕空间。
  • 使用诸如RelativeLayoutLinearLayout之类的视图组来排列视图。这种方法允许系统将视图的位置调整为电视屏幕的大小,对齐方式,长宽比和像素密度。
  • 在布局控件之间添加足够的边距,以避免UI混乱。

过扫描

用户必须始终可见的屏幕元素应放置在过扫描安全区域内。在布局中的左右边缘分别增加5%的空白量48dp,在顶部和底部边缘增加27dp的边距可确保该布局中的屏幕元素位于过扫描安全区域内。

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

   <!-- Screen elements that can render outside the overscan safe area go here -->

   <!-- Nested RelativeLayout with overscan-safe margin -->
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_marginTop="27dp"
       android:layout_marginBottom="27dp"
       android:layout_marginLeft="48dp"
       android:layout_marginRight="48dp">

      <!-- Screen elements that need to be within the overscan safe area go here -->

   </RelativeLayout>
</RelativeLayout>

**Caution:** Do not apply overscan margins to your layout if you are using the v17 leanback classes, such as浏览片段or related widgets, as those layouts already incorporate overscan-safe margins.

构建可用的文本和控件

TV应用程序布局中的文本和控件应易于查看并可以远距离浏览。请遵循以下提示,使您的用户界面元素更容易从远处看到:

  • 将文本分成小块,用户可以快速扫描。
  • 在深色背景上使用浅色文字。这种样式更容易在电视上阅读。
  • 避免使用轻量级字体或笔触既很窄又很宽的字体。使用简单的sans-serif字体和抗锯齿功能可提高可读性。
  • 使用Android的标准字体大小:
    <TextView
          android:id="@+id/atext"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:singleLine="true"
          android:textAppearance="?android:attr/textAppearanceMedium"/>

     

  • 确保所有视图小部件都足够大,以使坐在离屏幕10英尺远的人可以清楚看到(对于超大屏幕,此距离更大)。做到这一点的最佳方法是使用相对于布局的大小而不是绝对大小,并且使用密度无关的像素(dip)单元而不是绝对像素单元。例如,要设置窗口小部件的宽度,请使用wrap_content而不是像素测量,并为窗口小部件设置边距,请使用dip值而不是px值。

有关可处理更大屏幕尺寸的与密度无关的像素和建筑物布局的更多信息,请参阅支持多屏幕

管理电视的布局资源

普通的高清电视显示分辨率为720p,1080i和1080p。您的电视布局应将屏幕尺寸设置为1920 x 1080像素,然后允许Android系统在必要时将布局元素缩小为720p。通常,缩小尺寸(删除像素)不会降低布局显示质量。但是,升级可能会导致显示伪像,从而降低布局质量,并对应用程序的用户体验产生负面影响。
为了获得最佳的图像缩放效果,请尽可能将其作为9补丁图像元素提供。如果在布局中提供低质量或较小的图像,则它们将出现像素化,模糊或颗粒状,这对用户而言不是很好的体验。请改用高质量的图像。

处理大位图

电视设备与其他任何Android设备一样,具有有限的内存量。如果您使用非常高分辨率的图像构建应用程序布局,或者在应用程序的操作中使用许多高分辨率图像,则它可能会很快遇到内存限制并导致内存不足错误。为避免这些类型的问题,请遵循以下提示:

避免布局反图案

有几种构建布局的方法应避免使用,因为它们不能在电视设备上很好地工作并导致不良的用户体验。这是一些在开发电视版面时应该使用的用户界面方法。

  • 重用手机或平板电脑的布局 -未经修改,请勿重用手机或平板电脑应用中的布局。为其他Android设备形状尺寸构建的布局不太适合电视设备,应简化在电视上的操作。
  • ActionBar-尽管建议在手机和平​​板电脑上使用此用户界面约定,但不适用于电视界面。特别是,强烈建议不要使用操作栏选项菜单(或与此相关的任何下拉菜单),因为很难用遥控器浏览这样的菜单。
  • ViewPager-在屏幕上滑动可在手机或平板电脑上很好地工作,但不要在电视上尝试!

有关设计适合电视的布局的更多信息,请参阅电视设计指南。

提供有效的广告

对于起居室环境,我们建议您使用全屏并在30秒内将其停用的视频广告解决方案。必须使用D-pad(而非触摸板)访问Android TV上的广告功能(例如关闭按钮和点击)。

Android TV不提供网络浏览器。您的广告不得尝试启动网络浏览器或重定向到未经Android TV设备批准的Google Play商店内容。
**Note:** You can use the网页浏览class for logins to services like Google+ and Facebook.

五,创建电视导航

Note: You should only use these attributes to modify the navigation order if the default order that the system applies does not work well.
下面的代码示例演示如何定义下一个控件以接收TextView布局对象的焦点:

<TextView android:id="@+id/Category1"
        android:nextFocusDown="@+id/Category2"\>

下表列出了Android用户界面小部件的所有可用导航属性:

属性功能
nextFocusDown定义当用户向下导航时接收焦点的下一个视图。
nextFocusLeft定义当用户向左导航时接收焦点的下一个视图。
nextFocusRight定义当用户向右导航时接收焦点的下一个视图。
nextFocusUp定义下一个视图,以在用户向上导航时获得焦点。

要使用这些显式导航属性之一,请将其值设置为布局中另一个小部件的ID(android:id值)。您应该将导航顺序设置为循环,以便最后一个控件将焦点引导回第一个。

提供清晰的重点和选择

电视上的应用程序导航方案的成功取决于用户确定屏幕上关注的用户界面元素的难易程度。
您的应用布局和实现应使用颜色,大小,动画或这些属性的组合,以帮助用户轻松确定下一步可以采取的措施。使用统一的方案来指示整个应用程序的焦点。

六。请求后台播放

通常,当用户单击“ 主页”以显示电视启动器时,活动会暂停。但是,您的应用可以请求后台播放,其中活动将继续在电视启动器后面播放。

要请求后台播放,请调用requestVisibleBehind()。如果活动停止可见,请确保清理媒体资源。例如,如果requestVisibleBehind()返回false表示请求失败,或者系统调用对onVisibleBehindCanceled()的覆盖,则应该释放媒体资源。

@Override
public void onPause() {
  super.onPause();
  if (mVideoView.isPlaying()) {
    // Argument equals true to notify the system that the activity
    // wishes to be visible behind other translucent activities
    if (! requestVisibleBehind(true)) {
      // App-specific method to stop playback and release resources
      // because call to requestVisibleBehind(true) failed
      stopPlayback();
    }
  } else {
    // Argument equals false because the activity is not playing
    requestVisibleBehind(false);
  }
}

@Override
public void onVisibleBehindCanceled() {
  // App-specific method to stop playback and release resources
  stopPlayback();
  super.onVisibleBehindCanceled();
}

**The methodrequestVisibleBehind()was deprecated in API level 26.** It will be removed in a future release. The functionality described on this page is not supported in Android version 8.0 and later.

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐