Android TV开发规范
一.Android TV概述
Android TV应用使用与手机和平板电脑相同的架构,这就意味着我们可以根据已经了解的有关构建Android应用的方法去构建新的电视应用程序,或者将现有的应用程序拓展到电视设备上去运行。
二.创建电视应用
Android提供了丰富的用户体验,针对大屏幕的设备(如Android TV)上运行的应用进行了优化。TV的用交互与平板和手机设备有很大的不同,为了在TV设备上构建更好的应用程序,我们必须设计可以在10英尺外能轻松理解的布局,并提供仅使用方向键和选择按钮的导航。
2.1 创建TV项目
创建在TV上运行的应用程序需要的两个主要组件:
- Action for TV(必填)-在应用的manifest中,声明要在TV上运行的Activity。
- TV Support Libraries(可选)-支持库提供了用于创建在TV设备上运行的部件。
前提条件: - 将SDK工具更新至24.0.0或更高版本
更新SDK工具可以构建和测试电视应用程序 - 将SDK升级到Android 5.0(API 21)或者更高
更行后的平台版本给应用提供了新的API - 创建或升级项目
为了在TV设备上使用新的API,在创建或者修改已经存在的项目时,必须将目标设置为Android 5.0(API 21)或者更高
2.1.1 声明一个TV的Activity
应用要在TV上运行,必须在清单文件中声明一个可以启动的Activity,使用CATEGORY_LEANBACK_LAUNCHER Intent filter来执行此操作。这个filter能够标识应用可以能够在TV上使用和让Google Play将其视为TV应用。
<application
android:banner="@drawable/banner" >
...
<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>
2.1.2 声明支持Leanback
声明应用使用Android TV所需的Leanback用户界面。如果开发移动设备(手机,可穿戴设备,平板电脑等)以及Android TV上运行的应用,将required属性设置为false;如果设置为true,则应用仅能运行在使用Leanback UI的设备上。
<manifest>
<uses-feature android:name="android.software.leanback"
android:required="false" />
...
</manifest>
2.1.3 声明不要触摸屏
清单文件中必须声明android.hardware.touchscreen这个功能不需要。这个设置将应用标识为能在电视设备运行并且Google Play将其视为TV应用,否则不会出现在电视设备上的Google Play中。
<manifest>
<uses-feature android:name="android.hardware.touchscreen"
android:required="false" />
...
</manifest>
2.1.4 提供桌面banner
Banner是显示在桌面的应用的启动入口。Banner应该是xhdpi资源,大小为320 * 180,图片中必须包含文字。如果app支持多语言,则必须为每个支持的语言提供单独版本的banner文字。
<application
...
android:banner = “@ drawable / banner” > ... </ application>
2.2电视硬件处理
电视硬件与其他Android设备不同,电视上不包括其他Android设备上的某些硬件功能,如触摸屏,相机和GPS。在创建应用程序时,必须考虑电视硬件和要求。
2.2.1 检测电视设备
如果应用同时在TV和其他设备上操作则需要检测应用运行的设备并调整操作。确定是否在TV上运行推荐使用UiModeManager.getCurrentModeType()方法检查。
2.2.2不支持的硬件功能
Hardware | Android feature descriptor |
Touchscreen | android.hardware.touchscreen |
Touchscreen | emulator android.hardware.faketouch |
Telephony | android.hardware.telephony |
Camera | android.hardware.camera |
Near Field Communications (NFC) | android.hardware.nfc |
GPS | android.hardware.location.gps |
Microphone | android.hardware.microphone |
Sensors | android.hardware.sensor |
Screen in portrait orientation | android.hardware.screen.portrait |
2.2.3 声明电视硬件要求
在应用清单中声明硬件功能要求以确保应用不会安装在不提供这些功能的设备上,所有在电视设备上使用的应用必须声明不需要触摸屏功能。
<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"
android:required="false"/>
2.2.4检查硬件功能
在APP运行时,Android框架可以检测硬件功能是否可用,在运行时使用hasSystemFeature(String)检测特定功能是否可用。
// Check if android.hardware.touchscreen feature is available.
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {
Log.d("HardwareFeatureTest", "Device has a touch screen.");
}
2.3电视控制管理
电视需要其他辅助设备如遥控器和游戏手柄来与应用进行交互。因此应用必须支持遥控器输入。应用可以通过上下左右,后退,主页按钮进行操作。当用户操作遥控器时,应用会收到带有Key Event的事件,应用应该与响应遥控器按钮一直的行为。
2.4电视布局创建
电视屏幕通常距离大约10英尺远,虽然TV比其他Android设备显示器大得多,但并不能提供与较小设备相同水平的颜色和细节。因此创建应用时必须考虑TV设备布局以提供好的用户体验。
2.4.1使用电视布局主题
1.使用Leanback主题
v17 leanback support library包含了Theme.Leanback,该主题提供了统一的TV视觉风格,Android强烈建议在TV应用中使用v17 leanback。
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:theme="@style/Theme.Leanback">
如果应用使用了support fragment,Activity必须继承Fragment Activity。
2.No Title 主题
标题栏是手机和平板上Android 应用的标准UI元素,不适用TV应用,如果不使用v17leanback,应用应该在Activity上禁止显示标题栏。
<application>
...
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar">
...
</activity>
</application>
2.4.2电视基本布局设置
电视设备的布局应遵循一些基本准则,以确保它们在大屏幕上可用且有效。
- 构建具有横向方向的布局。电视屏幕始终以横向模式显示。
- 使用Fragment来创建多个区域的UI,使用GridView替代ListView让水平空间更好的利用。
- 使用如RelativeLayout,Linear Layout等View Group来排列Ui。
- 空间之间保持足够的边距避免UI混乱。
2.4.3 Over Scan
由于电视始终呈现全屏画面给观众,电视布局有一些独特的要求,为确保填满整个显示区,TV设备可以裁剪应用布局的外边缘。对用户一直可见的屏幕元素必须位于OverScan的安全区内。为了确保布局元素在Over Scan的安全区内,在左右边缘添加5% 的48dp,上下27dp的外边距。此方法可以确保背景元素在所有的设备都正确。如果使用了v17 leanback类(如BrowseFragment相关空间),不要设置OverScan边距,这些布局已经包含过。
2.4.4创建文本和控件
电视应用布局中的文本和控件应该很容易看到并可以远距离导航。遵循以下提示:
- 将文本分成用户可以快速扫描的小块。
- 深色背景使用浅色文字。
- 避免轻量级字体或具有非常窄和非常宽的笔划的字体。使用简单的sans-serif字体和抗锯齿来提高可读性。
- 使用Android标准字体大小:android:textAppearance="?android:attr/textAppearanceMedium"。
- 确保所有视图窗口小部件足够大,以便与距离屏幕10英尺远的人清晰可见(对于非常大的屏幕,此距离更大)。
2.5使用leanback支持库创建电视播放应用
浏览和播放媒体文件是TV提供给用户很常用的一个体验,允许用户快速浏览并获取到所需内容非常的重要。Android v17 leanback支持库为这类应用提供了很好的框架。
2.5.1创建目录浏览
在电视上运行的媒体应用程序需要允许用户浏览其内容产品,进行选择并开始播放内容。此类应用的内容浏览体验应该简单直观。使用v17 leanback支持库提供的类来实现用户界面,以便从应用程序的媒体目录中浏览音乐或视频。Leanback支持库中的BrowseFragment可以使用最少的代码创建出媒体类别和浏览项。
2.5.2提供卡片视图
给媒体文件创建卡片视图并将他们显示到目录浏览,通常使用BaseCardView及其子类显示媒体相关数据。
2.5.3创建详情页面
V17 leanback支持库提供了媒体资源浏览界面用来显示一些附加信息(如描述,评论),以及要对该媒体做什么样的操作(如购买或者播放该内容)。DetailsFragment类用来实现媒体详情页面。
2.5.4使用leanback操控控件
Leanback支持库中的媒体播放控件提供了更好的用户体验。对于视频类应用,控件提供了视频快进快退预览,快进快退时会显示视频缩略图。Leanback支持库使得UI控制与媒体播放实现分离。
2.5.5显示正在播放的卡片
当TV 应用在后台播放媒体文件时,必须显示Now Playing 卡片。这张卡片允许用户返回到正在播放媒体的应用。当有正在运行的MediaSession时,Android会在桌面去显示Now Playing 卡片,卡片中可以包含媒体的metadata
三.帮助用户在TV上找到APP的内容
TV提供了很多的娱乐选择,来自APP及其相关服务。同时大多数用户更喜欢在使用TV时做更少的输入,因而应用应该提供快速简便的路径给用户去发现内容。
3.1 在TV上推荐内容
根据不同的Android版本,Android TV 有两种不同的方式在桌面显示推荐内容:
- 在Android 8.0及以后版本,应用可以在一个或多个通道上显示推荐内容,内容显示在不同的行,默认行总是显示,用户可以在桌面添加其他的通道。
- 在Android 8.0之前,TV显示所有的推荐在一个推荐行中,推荐行一直显示在桌面。
3.2 让应用内容可搜索
Android TV使用Android 搜索界面从已安装的应用中检索内容数据,并将结果返回给用户。应用的数据内容可以包含在这些结果中,以便用户及时访问。当用户在搜索框中输入字符,应用必须为Android TV提供字段,从中生成结果。因此应用必须实现Content Provider并伴随着一个描述Content Provider和一些重要信息的searchable.xml文件。当用户选择了建议的搜索结果,应用需要一个Activity去处理这个意图。
表字段:
Value | Description |
SUGGEST_COLUMN_TEXT_1 | 内容名(需要) |
SUGGEST_COLUMN_TEXT_2 | 描述内容 |
SUGGEST_COLUMN_RESULT_CARD_IMAGE | 内容的图片,海报,封面 |
SUGGEST_COLUMN_CONTENT_TYPE | 媒体的MIME类型(需要) |
SUGGEST_COLUMN_VIDEO_WIDTH | 媒体分辨率的宽 |
SUGGEST_COLUMN_VIDEO_HEIGHT | 媒体分辨率的高 |
SUGGEST_COLUMN_PRODUCTION_YEAR | 内容在制作年份(需要) |
SUGGEST_COLUMN_DURATION | 媒体的时长(需要) |
Searchable.xml:
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search_label"
android:hint="@string/search_hint"
android:searchSettingsDescription="@string/settings_description"
android:searchSuggestAuthority="com.example.android.tvleanback"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestIntentData="content://com.example.android.tvleanback/video_database_leanback"
android:searchSuggestSelection=" ?"
android:searchSuggestThreshold="1"
android:includeInGlobalSearch="true">
</searchable>
处理搜索请求:
...
<activity
android:name="com.example.android.tvleanback.DetailsActivity"
android:exported="true">
<!-- Receives the search request. -->
<intent-filter>
<action android:name="android.intent.action.SEARCH" />
<!-- No category needed, because the Intent will specify this class component -->
</intent-filter>
<!-- Points to searchable meta data. -->
<meta-data android:name="android.app.searchable"
android:resource="@xml/searchable" />
</activity>
...
<!-- Provides search suggestions for keywords against video meta data. -->
<provider android:name="com.example.android.tvleanback.VideoContentProvider"
android:authorities="com.example.android.tvleanback"
android:exported="true" />
...
3.3 TV 应用内的搜索
当在TV上使用媒体应用时,用户经常会考虑特定的内容。若果应用包含大量的内容目录,浏览标题不是用户找到所需内容的最好方式。因此搜索界面可以帮助用户更快的获取到他们想要的内容。LeanBack 支持库一组类,使应用程序的搜索界面与电视搜索功能一致,搜索页面使用包含了SearchFragment的布局,这个Fragment必须实现SearchFragment.SearchResultProvider。
四 Android TV设计准则
Android TV具有沉浸式和高分辨率,支持最佳的TV互动体验。它采用了10英尺之外的material design UI风格。与便携式设备不同,电视体验是在不同的空间内发生,并且需要在十英尺之外清晰可见。
4.1 设计原则
4.1.1 视觉创意
- 休闲体验:人们经常以轻松的心态使用电视。休闲体验是Android TV的主要使用,在内容搜索时,每个部分都应该简单,新的内容易于被发现。减少选择的次数,默认操作只需点击一次即可。
- 电影体验:用图片和声音去描述内容,大屏幕给高分辨率图片和视觉元素提供了创建丰富动态体验的机会。在过渡和反馈操作期间使用移动。
- 轻量级的互动:最大限度地减少执行操作所需的导航步骤数,尽可能避免让用户输入文本,并在需要输入文本时使用语音界面。
4.1.2 为TV设计的应用
适合电视的应用
- Should:包含简单的设置,利用有限放大屏幕,共享公共资源,突出主要的内容。
- Should not:文字量大,注重任务管理。
简单的导航
- TV应该为内容选择提供快捷的操作路径。
信息密度
- Should:默认显示最重要和最必要的信息,使用滚动会渐进来展示内容。
Should not:避免过度显示,不要一次显示多有内容。
4.2 App导航
4.2.1 焦点
焦点总在一个对象上。文字,按钮,卡片或其他元素都可以获取焦点,要清楚的表明哪个被选择或者获取到了焦点。
- 焦点可见:获取焦点的和没有获取的要有对比区别。
-
反馈:在有焦点和没焦点之间切换时给用户视觉上的反馈。在焦点改变时或者有选中时,TV也有声音上的反馈。
4.2.2 结构设计
- 明确的方向操作:控件放置不与其他可操作的控件重叠,例如搜索操作,避免在很难操控到的位置摆放控件。
Do
Do not - 轴:设计布局时利用水平与垂直轴,为每个方向指定特定功能,使大型的层次结构可以快速的导航。
Do
Do not
4.3 TV应用程序
浏览页:浏览页是TV应用程序常用入口,通过类别使用户可以方便浏览。
详细页:详细页提供了所选内容的相关描述,讲可操作的内容和详细信息放在屏幕立即可见的位置,不需要滑动。
App搜索:提供快速搜索应用内容的方法。
Dialog:
在左侧为用户提供所需的内容,强烈建议包含相关的描述。
默认焦点应该始终位于Key Line上,用户选择后应该跳转到下一屏或关闭对话框。
App设置:
建议将设置放在最后一栏,设置应该显示在设置面板中。
Color:如果强调色太浅,使用较暗的背景色,不要使用较为鲜艳的颜色尤其是作为白色文字的背景。
字体样式:
主色调:在应用的整个UI中使用一致的颜色方案,例如卡片,浏览栏,控制条,背景图像等。