Android Studio V3.12环境下TV开发教程
(转自Android官网https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80618260
处理电视硬件
电视硬件与其他Android设备有很大不同。 电视不包括其他Android设备上的某些硬件功能,例如触摸屏,相机和GPS接收器。 电视也完全依赖辅助硬件设备。 为了让用户与电视应用程序交互,他们必须使用遥控器或游戏手柄。 当您构建电视应用程序时,您必须仔细考虑在硬件上运行的硬件限制和要求。
本课程介绍如何检查您的应用是否在电视上运行,以及如何处理不支持的硬件功能。 要了解各种输入方法,请参阅管理电视控制器 。
检查电视设备
如果您正在构建可在电视设备和其他设备上运行的应用程序,则可能需要检查您的应用程序正在运行的设备类型,并调整应用程序的操作。 例如,如果您的应用程序可以通过Intent启动,则应用程序应检查设备属性以确定它是否应启动面向电视的活动或电话活动。
确定您的应用是否在电视设备上运行的推荐方法是使用UiModeManager.getCurrentModeType()方法检查设备是否在电视模式下运行。 以下示例代码显示了如何检查您的应用是否在电视设备上运行:
public static final String TAG = "DeviceTypeRuntimeCheck";UiModeManager uiModeManager = (UiModeManager) getSystemService(UI_MODE_SERVICE);if (uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION) { Log.d(TAG, "Running on a TV Device");} else { Log.d(TAG, "Running on a non-TV Device");}
处理不支持的硬件功能
根据您的应用程序的设计和功能,您可能能够解决某些不可用的硬件功能。 本节讨论电视通常无法使用哪些硬件功能,如何检测缺失的硬件功能,并建议使用这些功能的替代方案。
不支持的电视硬件功能
电视与其他设备具有不同的用途,因此它们不具有其他Android设备经常具有的硬件功能。 出于这个原因,Android系统不支持电视设备的以下功能:
硬件Android功能描述符
触摸屏android.hardware.touchscreen
触摸屏模拟器android.hardware.faketouch
电话android.hardware.telephony
相机android.hardware.camera
近场通信(NFC)android.hardware.nfc
全球定位系统android.hardware.location.gps
麦克风[1]android.hardware.microphone
传感器android.hardware.sensor
屏幕纵向android.hardware.screen.portrait
[1]某些电视控制器有一个麦克风,与此处所述的麦克风硬件功能不同。 控制器麦克风完全支持。
有关功能,子功能及其描述符的完整列表,请参阅功能参考 。
声明电视的硬件要求
Android应用程序可以在应用程序清单中声明硬件功能要求,以确保它们不会安装在不提供这些功能的设备上。如果您要扩展现有的应用程序以便在电视上使用,请仔细查看应用程序的清单,了解可能会阻止其安装在电视设备上的任何硬件要求声明。
如果您的应用使用电视无法使用的硬件功能(如触摸屏或相机),但可以在不使用这些功能的情况下进行操作,请修改应用的清单以指示应用不需要这些功能。 以下清单代码段演示了如何声明您的应用不需要电视设备上不可用的硬件功能,即使您的应用可能会在非电视设备上使用这些功能:
注意:某些功能具有像android.hardware.camera.front这样的子功能,如功能参考中所述 。 请务必将required="false"任何子功能标记为required="false"并在您的应用中使用。
所有打算在电视设备上使用的应用程序必须声明触摸屏功能不是必需的,如电视应用程序入门中所述。 如果您的应用程序通常使用上面列出的一个或多个功能,请将您的清单中的这些功能的android:required属性设置更改为false 。
警告:通过将硬件功能设置为true来声明硬件功能可防止您的应用安装在电视设备上或出现在Android TV主屏幕启动器中。
一旦决定为您的应用程序制定可选的硬件功能,您必须在运行时检查这些功能的可用性,然后调整应用程序的行为。 下一节讨论如何检查硬件功能并提出一些改变应用程序行为的方法。
有关在清单中过滤和声明uses-feature更多信息,请参阅uses-feature指南。
声明含有硬件功能的权限
某些uses-permission清单声明意味着硬件功能 。 此行为意味着在您的应用清单中请求某些权限可能会排除您的应用在电视设备上的安装和使用。 以下通常请求的权限会创建隐式硬件功能要求:
允许隐含的硬件功能
RECORD_AUDIOandroid.hardware.microphone
CAMERAandroid.hardware.camera
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATIONandroid.hardware.location
android.hardware.location.network (目标API级别仅为20或更低)。
ACCESS_FINE_LOCATIONandroid.hardware.location
android.hardware.location.gps (仅限目标API级别20或更低)。
有关暗示硬件功能要求的权限请求的完整列表,请参阅uses-feature指南。 如果您的应用程序请求上面列出的功能之一,请在清单中为隐含的硬件功能添加一个uses-feature声明,以指示它不是必需的( android:required="false" )。
注意:如果您的应用面向Android 5.0(API级别21)或更高版本并使用ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION权限,则即使电视设备没有网卡或GPS接收器,用户仍然可以在电视设备上安装您的应用。
检查硬件功能
Android框架可以告诉您硬件功能是否在您的应用运行的设备上不可用。 使用hasSystemFeature(String)方法在运行时检查特定功能。 该方法接受一个字符串参数,用于指定要检查的功能。
以下代码示例演示如何在运行时检测硬件功能的可用性:
// Check if the telephony hardware feature is available.if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) { Log.d("HardwareFeatureTest", "Device can make phone calls");}// Check if android.hardware.touchscreen feature is available.if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) { Log.d("HardwareFeatureTest", "Device has a touch screen.");}
触摸屏
由于大多数电视没有触摸屏,Android不支持电视设备的触摸屏交互。 此外,使用触摸屏与用户坐在离显示器10英尺远的观看环境不一致。 确保您的UI元素和文本不需要或暗示使用触摸屏。
在电视设备上,您应该设计自己的应用程序,以便通过使用电视遥控器上的方向键盘(D-pad)支持导航来使用此交互模式。 有关使用电视友好控件正确支持导航的更多信息,请参阅创建电视导航 。
相机
尽管电视机通常没有相机,但您仍然可以在电视机上提供与摄影相关的应用程序。 例如,如果您的应用需要拍摄,查看和编辑照片,则可以禁用其电视拍摄功能,并允许用户查看甚至编辑照片。 如果您决定在电视上启用与相机相关的应用程序,请在应用程序清单中添加以下功能声明:
如果您的应用在没有摄像头的情况下运行,请将代码添加到您的应用中,以检测摄像头功能是否可用,并对应用的操作进行调整。 以下代码示例演示如何检测相机的存在:
// Check if the camera hardware feature is available.if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) { Log.d("Camera test", "Camera available!");} else { Log.d("Camera test", "No camera available. View and edit features only.");}
全球定位系统
电视是固定的,室内设备,并且没有内置的全球定位系统(GPS)接收器。 如果您的应用使用位置信息,您仍然可以允许用户搜索位置,或者使用静态位置提供商,例如在电视设备设置期间配置的邮政编码。
// Request a static location from the location managerLocationManager locationManager = (LocationManager) this.getSystemService( Context.LOCATION_SERVICE);Location location = locationManager.getLastKnownLocation("static");// Attempt to get postal or zip code from the static location objectGeocoder geocoder = new Geocoder(this);Address address = null;try { address = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1).get(0); Log.d("Zip code", address.getPostalCode());} catch (IOException e) { Log.e(TAG, "Geocoder error", e);}
在低功耗模式下暂停播放
某些电视设备在用户关闭设备时支持低功耗模式。 该设备不会关机,而是禁用显示屏,并使Android TV在后台运行。 在此模式下,音频输出仍然处于启用状态,因此您的应用在设备处于低功耗模式时应该停止任何正在播放的内容。
为避免在低功耗模式下播放,请覆盖onStop()并停止当前正在播放的内容:
@Overridepublic void onStop() { // App-specific method to stop playback stopPlayback(); super.onStop();}
当用户重新打开电源时,如果您的应用程序是活动的前台应用程序,则会调用onStart() 。 有关启动和停止活动的更多信息,请参阅活动生命周期 。