一、序
你慢慢會(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ù)手段,將用戶(hù)數(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 都是比較小眾的。另外三星之類(lèi)的廠商,也從去年開(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)目,你想完全依賴(lài) 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)就收不到消息了,用戶(hù)只會(huì)說(shuō)這個(gè)手機(jī)有問(wèn)題而不會(huì)說(shuō)微信有問(wèn)題。這兩個(gè)協(xié)議對(duì)智能電視也是一樣。
但是有歸有,好不好用就是另外的說(shuō)法了。所有的投屏協(xié)議,都是存在兩端,客戶(hù)端和接收端,智能電視在出廠時(shí),集成的都是接收端的協(xié)議,如果遇上不好用的情況,可以嘗試安裝“樂(lè)播投屏 App”來(lái)解決。
大多數(shù)情況下,我們更多的是和協(xié)議的客戶(hù)端在打交道,這里推薦一個(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ù)的方式,方便用戶(hù)在電視和其他設(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)目源碼。
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。