Android TV开发总结(一)构建一个TV app前要知道的事儿

前言:近年来,智能电视的发展如火如荼,Googel 也在大力推进TV及穿带设备的发展,在互联网的风口,是猪也会飞,这句话并不是没有道理的。传统电视机厂商,基本都转型致力于智能电视的相关业务。

  • 处理电视硬件
  • app上检查电视设备
  • 处理不支持的硬件features
  • Declaring hardware requirements for TV
  • 声明权限意味着硬件要具有该特性
  • 检查硬件Features
  • 处理控制器断开场景

处理电视硬件

电视硬件是大大不同于其他Android设备。电视不包括其他Android设备上发现的一些硬件特性,如触屏,摄像头,GPS接收器。电视也完全依靠辅助硬件设备。为了让用户与电视应用程序交互,他们必须使用一个遥控器或游戏手柄。当你为电视构建一个应用程序,你必须仔细考虑硬件操作电视硬件的限制和要求。

app上检查电视设备

如果您正在构建一个app运行在TV设备和其他设备,你也许需要去check你的app运行在什么样的设备上且可能将在你的app做何种操作。 例如,如果您有一个app被Intent启动,你的应用应当被检查设备属性去确定是否能启动在TV下的activity或者是在手机上的activity.

推荐一种方法来确定你的app是否运行在一个TV设备下, 通过使用UiModeManager.getCurrentModeType()方法来检查该设备是否在TV模式下运行。 下面的示例代码显示了如何检查你的应用程序是否运行在一个TV设备:

处理不支持的硬件features

根据应用程序的设计和功能,你可以解决某些硬件功能不可用。了解什么硬件特性通常不用于电视,如何检测丢失的硬件特性,并建议使用这些特性。

  • 不支持的电视硬件features

电视相比其他设备有着不同的作用,所以它们没有其他android设备通常有的一些硬件特性。出于这个原因,Android系统不支持电视设备有以下特点:

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 [1]

android.hardware.microphone

Sensors

android.hardware.sensor

Screen in portrait orientation

android.hardware.screen.portrait

一些电视控制器有一个麦克风,麦克风不一样的硬件功能描述。控制器麦克风完全支持。

Declaring hardware requirements for TV

Android应用程序可以声明硬件功能要求在app中Manifest,以确保他们不被安装在此app下,设备不提供这些功能。如果你是扩展现有应用程序使用在电视上,仔细检查你的应用程序的清单,因为任何硬件requirements声明可能阻止它被安装在一个TV设备上。

如果您的应用程序使用硬件特性(如触摸屏或相机),不可用在TV上,但可以不使用这些功能,修改你的应用程序的清单,表明这些特性被应用程序不需要。以下清单代码片段演示了如何声明应用程序不需要硬件特性不可用在电视设备,即使没有电视设备上的应用程序可以使用这些功能:

一些features像android.hardware.camera subfeatures.front,在feature引导时,确保标识required=”false” 在任何子features中,因为也许会使用在app中

所有应用在电视上使用,app必须声明中描述的触摸屏功能不需要使用。如果您的应用程序通常使用上面列出的一个或多个特性,在你的清单文件中,改变这些features像android:required attribute setting为false, 警告:声明一个hardware 的feature可通过设置一些属性值为true,避免你的app能安装在TV 设备或出现在Android TV的launcher启动页上

一旦你决定让你的硬件特性可选应用程序,您必须在运行时检查这些功能的可用性,然后调整你的应用程序的行为。

声明权限意味着硬件要具有该特性

一些uses-permission清单声明意味着硬件特性。这种行为意味着请求一些应用程序权限清单可以包含你的app从TV设备上安装和使用。下面的一般要求权限创建隐式硬件功能要求:

Permission

Implied hardware feature

RECORD_AUDIO

android.hardware.microphone

CAMERA

android.hardware.camera and android.hardware.camera.autofocus

ACCESS_COARSE_LOCATION

android.hardware.location android.hardware.location.network (Target API level 20 or lower only.)

ACCESS_FINE_LOCATION

android.hardware.location android.hardware.location.gps (Target API level 20 or lower only.)

完整的许可列表请求,意味着硬件功能要求,看到uses-feature指南。如果你的应用程序请求上面列出的特性之一,uses-feature声明包含在您的清单隐含的硬件功能,表明它不是必需的(android:required=“false”)。

注意:如果你的目标app运行在Android 5.0(API级别21)或更高版本,并使用ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限,用户仍然可以安装你的应用电视设备,即使电视设备没有网卡或GPS接收器。

检查硬件Features

Android框架可以告诉你如果没有可用的硬件特性在设备上,应用程序正在运行。使用hasSystemFeature(String)方法在运行时检查特定的功能。该方法接受一个字符串参数,指定您想要的功能检查。 下面的代码示例演示了如何在运行时检测硬件features的可用性:

Touch screen

因大多数电视没有触摸屏,Android不支持触屏交互电视设备。此外,使用一个触摸屏不符合观看环境中用户坐在远离显示10英尺。确保你的UI元素和文本不需要或暗示触摸屏的使用。 电视上的设备,你应该设计你的应用程序使用这个交互模型通过支持导航用定向杆(方向键)在一个电视遥控器。

Camera

虽然电视通常没有相机,你仍然可以提供一个photography-related电视应用。例如,如果您有一个应用程序需要,视图和编辑照片,您可以禁用它的拍照功能电视甚至还允许用户查看和编辑照片。如果你决定让camera-related应用在电视工作,添加以下功能声明应用程序清单:

如果你没有摄像头,使应用程序的运行代码添加到您的应用程序,检测如果相机功能可用,使调整应用程序的操作。下面的代码示例演示了如何检测相机的存在:

GPS

TV是静止的,室内设备,没有内置的全球定位系统(GPS)接收器。如果您的应用程序使用位置信息,您仍然可以允许用户搜索一个位置,或使用一个静态位置提供者如邮政编码在电视设备的配置设置。

Handling Controllers

TV设备需要辅助硬件设备与应用程序进行交互,一个基本形式的远程控制器或游戏控制器。这意味着您的应用程序必须支持方向键输入。这也意味着意味着你的app需要处控制器离线和外置设备(如键盘)输入,而不是一种类型的控制器(普通遥控器)。

方向键最低控制

电视设备的默认控制器是一个方向键。一般来说,应用程序应该是可操作的,只有从一个远程控制器,下,左,右,选择,和home键。如果你的应用是一种游戏,通常需要与额外的游戏控制器控制,应用程序应该试图让游戏与这些方向键控制。在这种情况下,应用程序也应该提醒用户需要一个控制器和允许他们使用方向键控制器优雅地退出你的游戏。

处理控制器断开场景

TV上控制器可能会断开,如蓝牙设备可能会为省电而有周期性的进入睡眠模式或从TV设备上断开。这意味着应用程序可能被中断或重启如果没有配置为处理这些连接事件。这些事件可以发生在有下列情形之一的:

  • 当在看一个几分钟长的视频时,方向键或游戏控制器进入睡眠模式,从电视设备断开连接,然后重新连接时。
  • 当在游戏中,一个新玩家加入游戏使用一个不是当前连接的游戏控制器。
  • 当在游戏中,玩家离开游戏并断开游戏控制器。

任何TV上的app中activity 是以断开和重连接事件为条件的,必须配置去处理重连接事件在app中Mainfest文件中,下面的代码示例演示了如何启用一个Activity来处理配置的变化,包括键盘或导航设备连接,断开,或重新连接:

原文发布于微信公众号 - 何俊林(DriodDeveloper)

原文发表时间:2016-10-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SEO

Google新动作:处理重复内容

33510
来自专栏沃趣科技

数据库容器化|未来已来

导语:“你不是不够好,你只是过时了”这句话用到 IT 行业特别合适,每隔一段时间都会有新的技术出现, 让码农们应接不暇。借着回顾DBA工作中的几个时期,跟大家分...

5356
来自专栏服务端技术杂谈

重构系统的套路-提高并发能力

比如我们在某段业务逻辑中加了一个同步写kafka的操作,tp99瞬间多了30毫秒,这样在整个监控曲线看起来非常扎眼,于是我们需要将这个同步改成异步。

932
来自专栏云计算

云计算领域中你需要知道的 52 个术语

你觉得你已经对云服务的所有东西了如指掌了吗?那么,来看一下这份由云服务相关的术语、短语、工具和服务提供商组成的列表来确保你确实做到了这一点吧。

3099
来自专栏社区的朋友们

Amazon Aurora 深度探索(二)

本文对 Aurora 系统的实现从整体架构、存储、事务处理三个方面进行深入探讨,基于其论文和相关资料讨论具体实现细节,又跳出其外、从数据库内核技术实现的角度对 ...

8301
来自专栏帅小子的日常

Dubbo介绍和服务架构分析

4428
来自专栏CSDN技术头条

关于如何阅读源码的一点心得

本文来自作者 追梦 在 GitChat 上分享 「关于为何以及如何阅读源码的一点心得」

1132
来自专栏程序人生

谈谈系统设计的面试

这个题目我一直在考虑要不要写,因为有一天也许我们彼此会坐在一方小桌的两端,聊聊系统设计,而我这么做有泄题兜底之嫌。不过,考虑到不是所有的读者都会来 TubiTV...

4626
来自专栏about云

openstack【juno】入门高级篇:为何你的实例ping不通外网【详述】

问题导读 1.本文解决ping通外网的思路是什么? 2.如何实现ping通外网? 3.ping域名bad address该如何解决? 前面是概述,这里给大家...

3616
来自专栏架构师之旅

Mysql在大型网站的应用架构演变

写在最前: 本文主要描述在网站的不同的并发访问量级下,Mysql架构的演变 可扩展性 架构的可扩展性往往和并发是息息相关,没有并发的增长,也就没有必要做高可扩展...

1938

扫码关注云+社区

领取腾讯云代金券