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