电视远不同于其它Android设备:
-
它们不是移动电话。
-
处于习惯,用户使用很少它们观看媒体,或者没有交互。
-
任何在一定距离外和它们进行交互。
因为电视和其它设备有着不同的目的,它们通常没有其它Android设备都有的硬件功能。由于这个原因,Android系统对电视设备不支持下面的功能:
硬件 |
Android功能描述符号 |
照相机 |
android.hardware.camera |
GPS |
android.hardware.location.gps |
麦克风 |
android.hardware.microphone |
进场通讯(NFC) |
android.hardware.nfc |
电话 |
android.hardware.telephony |
触摸屏 |
android.hardware.touchscreen |
这节课程向你展示了如何解决在电视上不可用的功能问题:
-
提供要解决的不支持的功能。
-
检查在运行时支持的功能,并且根据这些功能的可用性,有条件的激活/停用整个代码路径。
解决在电视上不支持的功能
—————————————————————————————————————————————————————————————
Android对电视设备不支持触屏交互,大部分电视没有触摸屏,并且使用触摸屏和电视交互不符合100英寸的环境。由于这些原因,用户使用遥控和Andorid电视交互。考虑到这一点,确保你的应用中的所有控件使用D-pad能被访问。回顾前面两节课程Optimizing Layouts for TV和Optimize Navigation for TV查看关于这个主题的更多信息。Android系统假设设备有一个触摸屏,所以如果你想你的应用程序运行在电视上,你必须在你的清单文件中明确的取消触摸屏要求:
<uses-feature android:name="android.hardware.touchscreen" android:required="false"/>
尽管电视没有照相机,你仍然可以在电视上提供关于照相的应用。例如,如果你又一个拍摄、查看和编辑照片的应用,你可以针对电视禁止它的拍照功能,并且仍然允许用户查看和编辑照片。下一节会谈到关于如何基于运行的设备类型的检测,禁止或激活在应用程序中的特定功能。
因为电视是静止的,室内设备,它们没有内置GPS。如果你的应用程序使用定位信息,在电视设置中配置,允许用户搜索一个位置,或者使用“静态”位置提供者从压缩码中获取位置。
LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
Location location = locationManager.getLastKnownLocation("static");
Geocoder 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);
}
电视通常不支持麦克风,但是如果你又一个使用了声控的应用程序,你能开发一个移动设备app获取声音输入,然后作为电视的一个远程控制。
在运行时检测可用的功能
—————————————————————————————————————————————————————————————
检测一个功能在运行时是否可用,调用hasSystemFeature(String)。这个方法拥有一个参数:一个你想检测的功能相应的字符串。例如,检测触摸屏,使用FEATURE_TOUCHSCREEN参数调用hasSystemFeature(String)。
下面的代码段演示了如何基于支持的功能在运行时检测设备类型:
// Check if android.hardware.telephony feature is available.
if (getPackageManager().hasSystemFeature("android.hardware.telephony")) {
Log.d("Mobile Test", "Running on phone");
// Check if android.hardware.touchscreen feature is available.
} else if (getPackageManager().hasSystemFeature("android.hardware.touchscreen")) {
Log.d("Tablet Test", "Running on devices that don't support telphony but have a touchscreen.");
} else {
Log.d("TV Test", "Running on a TV!");
}
这仅仅是一个运行时基于电视不支持特色的检测,来禁止应用功能的一个例子。