聊聊真實(shí)的 Android TV 開(kāi)發(fā)技術(shù)棧(android tv app開(kāi)發(fā))
一、序
你慢慢會(huì)發(fā)現(xiàn),身邊所有的電視都變成了智能電視。這是很容易接受的事實(shí),智能電視更便宜。
價(jià)格是不容忽視的敏感點(diǎn),顧客會(huì)天然的選擇物美價(jià)廉的智能電視。這看似不符合邏輯,為什么選擇落后的技術(shù),不允許聯(lián)網(wǎng)的傳統(tǒng)電視反而更貴呢?
廠商靠硬件的利潤(rùn)是固定的,當(dāng)小米發(fā)布“年輕人的第一臺(tái)電視”之后,通過(guò)搭建并自營(yíng)廣告、付費(fèi)內(nèi)容分發(fā)等服務(wù)手段,將用戶數(shù)據(jù)緊握在自己手中并實(shí)現(xiàn)貨幣化。以服務(wù)的收入來(lái)補(bǔ)貼硬件的成本,極大的壓低了智能電視的售價(jià)。
這很容易理解吧,之前都是單純的制造商,賣(mài)出一臺(tái)電視賺一臺(tái)電視的錢(qián),撇開(kāi)需要提供的質(zhì)保服務(wù)之外,這就是一錘子買(mǎi)賣(mài)。而當(dāng)電視可以聯(lián)網(wǎng)之后,就可以延伸出更多可能,你每一步操作都有廣告的體驗(yàn)、推薦給你的電視 App、你在電視上看的付費(fèi)視頻,這些都是服務(wù)的費(fèi)用,在你電視的使用壽命一直到終結(jié),廠商都可以從你那里獲得價(jià)值。
電視廠商已經(jīng)開(kāi)始從制造商轉(zhuǎn)變成服務(wù)商了。智能電視是大勢(shì)所趨,回頭是不可能回頭的,可能今后會(huì)有廠商繼續(xù)生產(chǎn)小眾的傳統(tǒng)電視,但也只是小眾。
再說(shuō)回到技術(shù)上,對(duì)于智能電視的系統(tǒng),得益于 Android 的開(kāi)放,市面上占有率最大的就是 Android 系統(tǒng),其次 Apple TV、Chromecast 都是比較小眾的。另外三星之類的廠商,也從去年開(kāi)始將新款電視的系統(tǒng),選定為 Android。
在智能電視領(lǐng)域,Android 才是主流。
不少人對(duì) Android TV 的技術(shù)印象,還停留在移動(dòng)開(kāi)發(fā)上,但其實(shí)它們并不一樣。
二、技術(shù)與 Android TV
只要是個(gè) Android 開(kāi)發(fā),就可以很容易的上手 Android TV 的項(xiàng)目,這一點(diǎn)毋庸置疑。
但是又不那么完全一樣,不能簡(jiǎn)單的把 TV 開(kāi)發(fā)理解成更大屏的手機(jī)去做,這其中還是有一些細(xì)節(jié)需要打磨的。
本文我就換一個(gè)角度,來(lái)分析 Android TV 開(kāi)發(fā)所涉及到的一些技術(shù)點(diǎn)。
2.1 設(shè)計(jì)風(fēng)格不同
電視最直觀的感受就是大屏,但是不能僅僅把它當(dāng)成放大版的手機(jī),這是有根本區(qū)別的。
在做電視 UI 設(shè)計(jì)的時(shí)候,要考慮到這個(gè)設(shè)計(jì)在兩三米開(kāi)外,還能不能看見(jiàn),電視和手機(jī)的視距是不一樣的。
在做設(shè)計(jì)的時(shí)候,就講究大塊、留白、滾動(dòng)、焦點(diǎn)效果等等,了解其中的差異即可。
2.2 API 的差異
都是 Android 系統(tǒng),在手機(jī)上能用的那一套 API,在智能電視上都可以用到。智能電視用到的 API,算是移動(dòng)開(kāi)發(fā)的一個(gè)補(bǔ)充。
舉個(gè)最簡(jiǎn)單的例子,在手機(jī)上操作,點(diǎn)擊一個(gè)內(nèi)容只有兩態(tài),普通態(tài)和按下態(tài),而在電視上是有三態(tài)的,無(wú)焦點(diǎn)態(tài)、獲取焦點(diǎn)態(tài)和按下態(tài),這就需要在移動(dòng)開(kāi)發(fā)中根本不會(huì)用到的 android:focusableInTouchMode 屬性來(lái)支持。
另外還有一些對(duì)焦點(diǎn)的處理,例如焦點(diǎn)動(dòng)畫(huà)、焦點(diǎn)記錄、焦點(diǎn)尋址等,雖然 Android 是以就近原則來(lái)計(jì)算方向操作時(shí),下一個(gè)獲取焦點(diǎn)的控件,但是有時(shí)候還是需要我們通過(guò)代碼去控制它的尋址效果。
電視開(kāi)發(fā)還有很多 API 上的區(qū)別,這里就不一一舉例了,其實(shí)很多效果都可以參照 Leanback 的實(shí)現(xiàn),這個(gè)后文會(huì)介紹。
2.3 涉及的工具
在電視開(kāi)發(fā)中,也有一些工具可以提高我們開(kāi)發(fā)的效率。
雖說(shuō)智能電視本質(zhì)還是 Android 設(shè)備,但是大部分電視和智能盒子在出廠時(shí),已經(jīng)關(guān)閉了調(diào)試口,如果和廠商合作或者在論壇搜尋,有一些特定的設(shè)備,經(jīng)過(guò)特殊的設(shè)置是允許開(kāi)啟 ADB 調(diào)試的。開(kāi)啟調(diào)試后,我們就可以通過(guò) adb connect 進(jìn)行連接,之后的調(diào)試就和普通的手機(jī)開(kāi)發(fā)沒(méi)有區(qū)別了。
電視調(diào)試有時(shí)候確實(shí)很麻煩,如果不是和特定硬件強(qiáng)相關(guān)的需求,我們可以直接使用普通手機(jī)進(jìn)行開(kāi)發(fā)調(diào)試。
電視和手機(jī)的交互方式是不同的,手機(jī)通過(guò)觸摸屏幕,而電視只能通過(guò)遙控器按鍵操控。那么為了在手機(jī)上模擬電視遙控器的操作,這里推薦一個(gè) Chrome 插件:ChromeADB。
只需要保證開(kāi)發(fā)設(shè)備和調(diào)試設(shè)備,ADB 連接通暢,通過(guò) ChromeADB,實(shí)現(xiàn)一些遙控器的簡(jiǎn)單上下左右的操作。
2.4 Google 的 Leanback 項(xiàng)目
Leanback 是 Google 真的 TV 開(kāi)源的一款 UI 框架,可以使用 Leanback 快速實(shí)現(xiàn) UI 效果,Leanback 主要都是圍繞 Fragment 展開(kāi)的。
在國(guó)內(nèi)的 TV App 項(xiàng)目中,基本上都不會(huì)使用 Leanback 推薦的效果,就像 Google 的 Material Design 設(shè)計(jì),所有設(shè)計(jì)都在轉(zhuǎn)發(fā)文章,但是就是不用,但是這并不妨礙我們研究它的實(shí)現(xiàn)。
Leanback 內(nèi)提供的 RecyclerView 把一些很頭疼的焦點(diǎn)記憶、焦點(diǎn)項(xiàng)目放大、滾動(dòng)時(shí)焦點(diǎn)塊居中等問(wèn)題都封裝好了,簡(jiǎn)單到可以拿來(lái)即用。
Leanback 最大的問(wèn)題是它是一個(gè) v17 的項(xiàng)目,也就是 minSdkVersion 為 17,而在國(guó)內(nèi)的環(huán)境下,TCL、聯(lián)想都還在出廠 4.2 以下的電視和盒子。也就是說(shuō)對(duì)于一個(gè)商業(yè)項(xiàng)目,你想完全依賴 Leanback 的官方指導(dǎo)來(lái)開(kāi)發(fā) App,將會(huì)有一部分設(shè)備的市場(chǎng)被放棄掉。
但是這并不是無(wú)法解決的硬傷,我印象中只是某些數(shù)據(jù)刷新的 notifyDataXxx() 方法,對(duì) API Level 有要求。所以只需要將這部分邏輯自己來(lái)實(shí)現(xiàn),就可以將 Leanback 用在 V14 的設(shè)備上。
具體實(shí)現(xiàn)我就不放代碼了,在 Github 上搜索 “V14 Leanback” 關(guān)鍵字,就能夠有所收獲。
2.5 音視頻
智能電視雖然可以安裝一些 App,但是最終還是要回歸本質(zhì),就是看電視。大部分電視 App,都是圍繞著音視頻方向,做內(nèi)容分發(fā)。
你能想到的主要的視頻 App,都存在電視版 App,做電視開(kāi)發(fā)無(wú)可避免的會(huì)遇到音視頻方向的問(wèn)題。
有關(guān)音視頻方向,簡(jiǎn)單點(diǎn)呢找個(gè) Github 上的開(kāi)源庫(kù)封裝一下也能用,但是出問(wèn)題了也很難排查。想要向這個(gè)方向研究,這里推薦一本前愛(ài)奇藝音視頻方向?qū)<液慰×值臅?shū)《Android 音視頻開(kāi)發(fā)》。
如果讓我針對(duì)智能電視的音視頻,只提一個(gè)建議,那肯定是慎用硬解。
我想這也很好理解,現(xiàn)在一臺(tái)智能電視比很多手機(jī)都便宜,最大的成本占比在屏幕上,可想而知它的其他硬件,還不如小米幾百塊的手機(jī)。
當(dāng)你使用硬解的時(shí)候,在一些低端設(shè)備上的表現(xiàn)就不可控了,會(huì)碰到非常惡心的黑屏、馬賽克、花屏等問(wèn)題。所以如果你的經(jīng)驗(yàn)沒(méi)那么豐富,推薦直接使用軟解。
2.6 投屏協(xié)議
電視的真實(shí)需求,還是看電視,任何強(qiáng)操作的需求,在電視上都是偽需求。
智能電視聯(lián)網(wǎng)后,我們就不必將看電視這個(gè)動(dòng)作局限在直播中。想將手機(jī)上的內(nèi)容投到電視上播放,這就涉及到投屏的協(xié)議。
市面上存在很多投屏的協(xié)議,基本上對(duì)投屏有點(diǎn)想法的都會(huì)定制一套投屏的協(xié)議。主流的只有兩個(gè) Google 的 DLNA 和 Apple 的 AirPlay,基本上屬于現(xiàn)在智能電視出廠時(shí)的標(biāo)配。
就像微信對(duì)手機(jī)的關(guān)系一樣,某個(gè)手機(jī)要是微信退出到后臺(tái)就收不到消息了,用戶只會(huì)說(shuō)這個(gè)手機(jī)有問(wèn)題而不會(huì)說(shuō)微信有問(wèn)題。這兩個(gè)協(xié)議對(duì)智能電視也是一樣。
但是有歸有,好不好用就是另外的說(shuō)法了。所有的投屏協(xié)議,都是存在兩端,客戶端和接收端,智能電視在出廠時(shí),集成的都是接收端的協(xié)議,如果遇上不好用的情況,可以嘗試安裝“樂(lè)播投屏 App”來(lái)解決。
大多數(shù)情況下,我們更多的是和協(xié)議的客戶端在打交道,這里推薦一個(gè)開(kāi)源項(xiàng)目 ConnectSDK,在其中對(duì)大部分協(xié)議做了支持。
ConnectSDK 是一個(gè)全平臺(tái)的 SDK,接入也有明確的文檔和示例,這里就不詳細(xì)講解了。
投屏的功能,在大部分主流的視頻 App,都是集成了投屏的功能。還有一些比較小眾的 App,例如快點(diǎn)投屏,可以將一些視頻網(wǎng)站上的內(nèi)容,投到智能電視上觀看。
投屏在智能電視的技術(shù)棧中,必定是需要點(diǎn)亮的。
2.7 本地服務(wù)
還是為了解決電視上操作困難的問(wèn)題,最簡(jiǎn)單的想要把一部下載好的藍(lán)光高清的電影,Copy 到電視上觀看,難度都很大。
所以不少 App 都通過(guò)搭建本地服務(wù)的方式,方便用戶在電視和其他設(shè)備之間傳輸文件。
在 Android 上,開(kāi)啟一個(gè) HTTP 服務(wù)的方法,有很多開(kāi)源項(xiàng)目可供選擇。
這里推薦 nanohttpd,只需一個(gè)文件就可以在 Android 上實(shí)現(xiàn)一個(gè)本地的 HTTP 服務(wù)器。并且使用的人很多,上傳文件、webserver 等已經(jīng)被實(shí)現(xiàn)了,開(kāi)箱即用。
三、小結(jié)時(shí)刻
我想看完本文,你對(duì) Android 智能電視開(kāi)發(fā)應(yīng)該有了一個(gè)基本的了解,不會(huì)再將它了解成一個(gè)更大屏的手機(jī)了。
就像前文提到的,智能電視注定是會(huì)被普及的,我最近看到頭條這樣做短視頻的公司,都已經(jīng)開(kāi)設(shè)了 Android TV 的產(chǎn)品崗位,我想今后 TV 開(kāi)發(fā)相關(guān)的崗位會(huì)越來(lái)越多。
你還知道有什么關(guān)于智能電視的技術(shù)點(diǎn),歡迎在留言區(qū)討論。
在頭條號(hào)私信我。我會(huì)送你一些我整理的學(xué)習(xí)資料,包含:Android反編譯、算法、設(shè)計(jì)模式、虛擬機(jī)、Linux、Kotlin、Python、爬蟲(chóng)、Web項(xiàng)目源碼。