Android Studio V3.12環(huán)境下TV開(kāi)發(fā)教程
(轉(zhuǎn)自Android官網(wǎng)https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80618260
電視硬件與其他Android設(shè)備有很大不同棍厂。?電視不包括其他Android設(shè)備上的某些硬件功能进苍,例如觸摸屏瓢剿,相機(jī)和GPS接收器缆镣。?電視也完全依賴(lài)輔助硬件設(shè)備戚扳。?為了讓用戶(hù)與電視應(yīng)用程序交互蝌箍,他們必須使用遙控器或游戲手柄。?當(dāng)您構(gòu)建電視應(yīng)用程序時(shí)牺汤,您必須仔細(xì)考慮在硬件上運(yùn)行的硬件限制和要求辽旋。
本課程介紹如何檢查您的應(yīng)用是否在電視上運(yùn)行,以及如何處理不支持的硬件功能。?要了解各種輸入方法补胚,請(qǐng)參閱管理電視控制器?码耐。
如果您正在構(gòu)建可在電視設(shè)備和其他設(shè)備上運(yùn)行的應(yīng)用程序,則可能需要檢查您的應(yīng)用程序正在運(yùn)行的設(shè)備類(lèi)型溶其,并調(diào)整應(yīng)用程序的操作骚腥。?例如,如果您的應(yīng)用程序可以通過(guò)Intent啟動(dòng)瓶逃,則應(yīng)用程序應(yīng)檢查設(shè)備屬性以確定它是否應(yīng)啟動(dòng)面向電視的活動(dòng)或電話活動(dòng)束铭。
確定您的應(yīng)用是否在電視設(shè)備上運(yùn)行的推薦方法是使用UiModeManager.getCurrentModeType()方法檢查設(shè)備是否在電視模式下運(yùn)行。?以下示例代碼顯示了如何檢查您的應(yīng)用是否在電視設(shè)備上運(yùn)行:
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");}
根據(jù)您的應(yīng)用程序的設(shè)計(jì)和功能厢绝,您可能能夠解決某些不可用的硬件功能契沫。?本節(jié)討論電視通常無(wú)法使用哪些硬件功能,如何檢測(cè)缺失的硬件功能代芜,并建議使用這些功能的替代方案埠褪。
電視與其他設(shè)備具有不同的用途浓利,因此它們不具有其他Android設(shè)備經(jīng)常具有的硬件功能挤庇。?出于這個(gè)原因,Android系統(tǒng)不支持電視設(shè)備的以下功能:
硬件Android功能描述符
觸摸屏android.hardware.touchscreen
觸摸屏模擬器android.hardware.faketouch
電話android.hardware.telephony
相機(jī)android.hardware.camera
近場(chǎng)通信(NFC)android.hardware.nfc
全球定位系統(tǒng)android.hardware.location.gps
麥克風(fēng)[1]android.hardware.microphone
傳感器android.hardware.sensor
屏幕縱向android.hardware.screen.portrait
[1]某些電視控制器有一個(gè)麥克風(fēng)贷掖,與此處所述的麥克風(fēng)硬件功能不同嫡秕。?控制器麥克風(fēng)完全支持。
有關(guān)功能苹威,子功能及其描述符的完整列表昆咽,請(qǐng)參閱功能參考?。
Android應(yīng)用程序可以在應(yīng)用程序清單中聲明硬件功能要求牙甫,以確保它們不會(huì)安裝在不提供這些功能的設(shè)備上掷酗。如果您要擴(kuò)展現(xiàn)有的應(yīng)用程序以便在電視上使用,請(qǐng)仔細(xì)查看應(yīng)用程序的清單窟哺,了解可能會(huì)阻止其安裝在電視設(shè)備上的任何硬件要求聲明泻轰。
如果您的應(yīng)用使用電視無(wú)法使用的硬件功能(如觸摸屏或相機(jī)),但可以在不使用這些功能的情況下進(jìn)行操作且轨,請(qǐng)修改應(yīng)用的清單以指示應(yīng)用不需要這些功能浮声。?以下清單代碼段演示了如何聲明您的應(yīng)用不需要電視設(shè)備上不可用的硬件功能,即使您的應(yīng)用可能會(huì)在非電視設(shè)備上使用這些功能:
注意:某些功能具有像android.hardware.camera.front這樣的子功能旋奢,如功能參考中所述?泳挥。?請(qǐng)務(wù)必將required="false"任何子功能標(biāo)記為required="false"并在您的應(yīng)用中使用。
所有打算在電視設(shè)備上使用的應(yīng)用程序必須聲明觸摸屏功能不是必需的至朗,如電視應(yīng)用程序入門(mén)中所述屉符。?如果您的應(yīng)用程序通常使用上面列出的一個(gè)或多個(gè)功能,請(qǐng)將您的清單中的這些功能的android:required屬性設(shè)置更改為false?。
警告:通過(guò)將硬件功能設(shè)置為true來(lái)聲明硬件功能可防止您的應(yīng)用安裝在電視設(shè)備上或出現(xiàn)在Android TV主屏幕啟動(dòng)器中筑煮。
一旦決定為您的應(yīng)用程序制定可選的硬件功能辛蚊,您必須在運(yùn)行時(shí)檢查這些功能的可用性,然后調(diào)整應(yīng)用程序的行為真仲。?下一節(jié)討論如何檢查硬件功能并提出一些改變應(yīng)用程序行為的方法袋马。
有關(guān)在清單中過(guò)濾和聲明uses-feature更多信息,請(qǐng)參閱uses-feature指南秸应。
某些uses-permission清單聲明意味著硬件功能?虑凛。?此行為意味著在您的應(yīng)用清單中請(qǐng)求某些權(quán)限可能會(huì)排除您的應(yīng)用在電視設(shè)備上的安裝和使用。?以下通常請(qǐng)求的權(quán)限會(huì)創(chuàng)建隱式硬件功能要求:
允許隱含的硬件功能
RECORD_AUDIOandroid.hardware.microphone
CAMERAandroid.hardware.camera
android.hardware.camera.autofocus
ACCESS_COARSE_LOCATIONandroid.hardware.location
android.hardware.location.network?(目標(biāo)API級(jí)別僅為20或更低)软啼。
ACCESS_FINE_LOCATIONandroid.hardware.location
android.hardware.location.gps?(僅限目標(biāo)API級(jí)別20或更低)桑谍。
有關(guān)暗示硬件功能要求的權(quán)限請(qǐng)求的完整列表,請(qǐng)參閱uses-feature指南祸挪。?如果您的應(yīng)用程序請(qǐng)求上面列出的功能之一锣披,請(qǐng)?jiān)谇鍐沃袨殡[含的硬件功能添加一個(gè)uses-feature聲明,以指示它不是必需的(?android:required="false"?)贿条。
注意:如果您的應(yīng)用面向Android 5.0(API級(jí)別21)或更高版本并使用ACCESS_COARSE_LOCATION或ACCESS_FINE_LOCATION權(quán)限雹仿,則即使電視設(shè)備沒(méi)有網(wǎng)卡或GPS接收器,用戶(hù)仍然可以在電視設(shè)備上安裝您的應(yīng)用整以。
Android框架可以告訴您硬件功能是否在您的應(yīng)用運(yùn)行的設(shè)備上不可用胧辽。?使用hasSystemFeature(String)方法在運(yùn)行時(shí)檢查特定功能。?該方法接受一個(gè)字符串參數(shù)公黑,用于指定要檢查的功能邑商。
以下代碼示例演示如何在運(yùn)行時(shí)檢測(cè)硬件功能的可用性:
// 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.");}
觸摸屏
由于大多數(shù)電視沒(méi)有觸摸屏,Android不支持電視設(shè)備的觸摸屏交互凡蚜。?此外人断,使用觸摸屏與用戶(hù)坐在離顯示器10英尺遠(yuǎn)的觀看環(huán)境不一致。?確保您的UI元素和文本不需要或暗示使用觸摸屏朝蜘。
在電視設(shè)備上恶迈,您應(yīng)該設(shè)計(jì)自己的應(yīng)用程序,以便通過(guò)使用電視遙控器上的方向鍵盤(pán)(D-pad)支持導(dǎo)航來(lái)使用此交互模式芹务。?有關(guān)使用電視友好控件正確支持導(dǎo)航的更多信息蝉绷,請(qǐng)參閱創(chuàng)建電視導(dǎo)航?。
相機(jī)
盡管電視機(jī)通常沒(méi)有相機(jī)枣抱,但您仍然可以在電視機(jī)上提供與攝影相關(guān)的應(yīng)用程序熔吗。?例如,如果您的應(yīng)用需要拍攝佳晶,查看和編輯照片桅狠,則可以禁用其電視拍攝功能,并允許用戶(hù)查看甚至編輯照片。?如果您決定在電視上啟用與相機(jī)相關(guān)的應(yīng)用程序中跌,請(qǐng)?jiān)趹?yīng)用程序清單中添加以下功能聲明:
如果您的應(yīng)用在沒(méi)有攝像頭的情況下運(yùn)行咨堤,請(qǐng)將代碼添加到您的應(yīng)用中,以檢測(cè)攝像頭功能是否可用漩符,并對(duì)應(yīng)用的操作進(jìn)行調(diào)整一喘。?以下代碼示例演示如何檢測(cè)相機(jī)的存在:
// 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.");}
全球定位系統(tǒng)
電視是固定的,室內(nèi)設(shè)備嗜暴,并且沒(méi)有內(nèi)置的全球定位系統(tǒng)(GPS)接收器凸克。?如果您的應(yīng)用使用位置信息,您仍然可以允許用戶(hù)搜索位置闷沥,或者使用靜態(tài)位置提供商萎战,例如在電視設(shè)備設(shè)置期間配置的郵政編碼。
// 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);}
某些電視設(shè)備在用戶(hù)關(guān)閉設(shè)備時(shí)支持低功耗模式舆逃。?該設(shè)備不會(huì)關(guān)機(jī)蚂维,而是禁用顯示屏,并使Android TV在后臺(tái)運(yùn)行路狮。?在此模式下虫啥,音頻輸出仍然處于啟用狀態(tài),因此您的應(yīng)用在設(shè)備處于低功耗模式時(shí)應(yīng)該停止任何正在播放的內(nèi)容览祖。
為避免在低功耗模式下播放孝鹊,請(qǐng)覆蓋onStop()并停止當(dāng)前正在播放的內(nèi)容:
@Overridepublic void onStop() {? // App-specific method to stop playback? stopPlayback();? super.onStop();}
當(dāng)用戶(hù)重新打開(kāi)電源時(shí)炊琉,如果您的應(yīng)用程序是活動(dòng)的前臺(tái)應(yīng)用程序展蒂,則會(huì)調(diào)用onStart()?。?有關(guān)啟動(dòng)和停止活動(dòng)的更多信息苔咪,請(qǐng)參閱活動(dòng)生命周期?锰悼。