如何撰寫一個「Android TV」的應用程式

Android:ATV

RICK
15 min readJul 24, 2020

概要

當人們談論到「Android」時,第一個想到幾乎就是「手機系統」。

這並不令人意外,畢竟在過去幾年,「Android OS」的確在「行動裝置」上表現異常亮眼,成為了「手機作業系統」的霸主。

不過,Google 是有野心的,而「Android」的版圖從來就都不僅只「行動裝置」上。

事實上,「Android OS」的誕生目的也不是因為行動裝置,這其中歷史筆者就不在本文中冗述了,直接上「Wiki」。

然而,隨著「Android OS」的發展逐漸蓬勃、成熟,「Google」便開始將其矛頭瞄準了「IoT」的領域,並佈局著。

像是「Google 在 2015 年的 IO 大會上,就推出由『Brillo』改名的『Android Things』」,如下圖:

當時,就有開發者玩笑的表示說:「實際上,Google 真正想取的名字應該不是『Android Things』,而是『Android Everythings』。」。

事實上,Google 的「佈局和計畫」無疑是成功的。

雖然「包了尿布層」的「Android OS」總會面臨效能上的問題,但這仍然無法否認「Android OS」在「IoT」的領域上已逐漸擁有了地位,像是在電視、機上盒的是「Android TV」、在穿戴式裝置上的「Wear OS」、在汽車上的是「Android Auto(Car)」…等。

這乍聽下很美妙,畢竟「WORA」,「Write once, run anywhere.」無數工程師嚮往的美地。

但實際上,並沒有想像中的如此美好。

雖然「Android OS」依然是那個「Android OS」,但終究必須面臨「設備性質不同」的問題,即使「APPs」所呼叫的「API」差異並不會太大,但「不同的設備就會有不同的特性,其包含螢幕大小、解析度、操作模式、安全性、常駐需求,甚至是使用者習慣…等。」。

而在「Android TV APPs」的上,其與手機的差異大致上有下列幾點,第一是「UI」的設計,第二是操作的方式,在「TV」上,我們慣用的是遙控器,而非觸控方式,更正確的說法是,就目前而言「全螢幕觸控電視」的價格太高昂,而且電視螢幕通常比較大,近距離的接觸操作反而不適合。

另外,就是「硬體配件的支援」,畢竟「TV」與「手機」是根本上的差異,包含價格、產品特性都是不同的。

最後一點,使用者的習慣,這與「隱私權」和「安全性」息息相關,就目前生態,「手機」傾向於私人物品,而「TV」則是相對有較高的機會與他人共享。

綜合上述,「Phone APPs」和「TV APPs」的撰寫特性自然是有所差異的。

而本篇文章的主要目的就是告訴大家,撰寫「TV APPs」時,其中的差異與該注意的事項。

本篇文章的主要參考資料為「Google Developer / Docs / Guides / Android TV」。

事實上,Google 有在「UDACITY」有推出「相關的課程」,此外 Google 也有提供關於「Android TV 的線上指南」,其內容涵蓋 UI、架構…等,挺值得一讀的。

正文

關於 Android TV APPs 的設計規範

事實上,關於「Android TV APPs」,「Google」有定義了一套「設計規範:Design for Android TV」的。

該規範是針對「Android TV 的特性」所設計的,例如大屏幕的 UI 設計、使用遙控器而非觸控的操作行為…等,當然其目的都是為了讓使用者具備更好的體驗。

此外,Google 也提到若「APPs」想要上架至「Google Play 的 Android TV 專屬應用程式區」,則必須符合其「TV APPs Quality」。

構建「Android TV APPs」的基本規範

如果構建一個 Android TV APP,那麼至少需要一個「TV Activity」。

何謂「TV Activity」?

事實上,它就只是個宣告了「CATEGORY_LEANBACK_LAUNCHER」的「Activity」,如下圖:

簡單的說,「聲明『TV Activity』的方式就是在「<intent-filter>」的標籤內新增一個『LEANBACK_LAUNCHER』的「<category>」。」。

事實上,「LEANBACK」的是「Android TV」的專屬套件,詳細在文章後續會有說明。

在此我們就暫時把「LEANBACK」當作「Android TV」的代名詞。

而「LEANBACK_LAUNCHER」,其機制就跟「LAUNCHER」標籤相同;與之不同是,其點擊的圖示是在「TV Launcher」,如下圖:

備註:「LAUNCHER」標籤,添加在「Manifest」文件中啟動「Activity」的底下,當使用者點擊「Phone Launcher」的「APPs」圖示時,該「Activity」會被喚起。

特別要注意的是,根據文件敘述,若未設置「LEANBACK_LAUNCHER」,則「TV Luncher」中就不會顯示該「APP」的圖示。

備註:「Launcher」就是就所謂的「應用程式列表」,而在「Android TV」中還另外設置有「TV Launcher」,而標籤「LEANBACK_LAUNCHER」就是與「TV Launcher」相關的標籤,是專屬於「Android TV」。

廣告橫幅的設置

廣告橫幅,也就是所謂的「Banner」,當宣告「LEANBACK_LAUNCHER」時,則該應用就會顯示在「TV Launcher」上。

而在「TV Launcher」上的顯示的圖片就是「Banner」,所以我們必須去提供「Banner」的圖檔,其建議解析為「320 px * 180 px」,原始文件如下:

繼承「Activity」

此外,這邊有一點要特別注意,該「Activity」所繼承是的「Activity」,而非我們平常撰寫「Phone APPs」 時慣用的「AppCompatActivity」,如下圖:

其原因是「Phone APPs」的佈局相對於「Android TV APPs」複雜許多,理所當然地,「AppCompatActivity」亦支援了某些「Activity」所不支援的相關佈局,例如「action bar」…等。

因此 Google 並不建議使用「AppCompatActivity」作為「Android TV APPs」的開發元件。

但事實上,「AppCompatActivity」是可以執行於「Android TV」上的,更正確的說法是「Activity」是「AppCompatActivity」的父類。

但問題是,在該情況下,若我們的 APP 在設計時不小心使用了超出範圍設計元件,就會導致該 APP 在運行時「閃退」。

「SDK」與「SDK Tools」的版本要求

除了需要繼承「TV Activity」之外,「Android TV APPs」針對「SDK」以及「SDK Tools」 的版本也有一定的要求,如下:

備註:更新 IDE 和 SDK 工具

Leanback 庫

在上述,所謂的「Android TV」專屬元件,其實指的就是「Leanback」庫,它是 Google 特地針對「Android TV APPs」所設計專門給開發者使用的的一個庫。

事實上,在多數的情況下,「Android TV APPs」的開發與「 Android Phone APPs」的開發非常相似。

但其之間最大的差異就在於「大屏幕的 UI 設計」與「使用遙控器的行為操作」,因此「Leanback」庫其中多數的元件不外乎都是跟上述兩者相關的,其中又以與 UI 相關的佈局元件占大多數,而與遙控器相關的,如語音輸入就是個例子。

簡單的理解,我們幾乎可以將「Leanback」庫與「Android TV APPs」劃上等號;因此,若我們要開發「Android TV APPs」,就必須要在該專案中「聲明『Leanback』支持」,其聲明的方式是透過「<uses-feature >」,如下:

在參數的部份,「name」的部份填入「leanback」,而「required」則是代表著必要性。

簡單說明一下,如果我們目前所開發的「APPs」,是專屬於「Android TV」的應用,僅能運行在具有「Leanback」界面設備上,那麼我們就可以將「required」的值設定為「true」,反之,若我們的「APPs」可以同時支援多種「Android」設備,像是行動裝置、穿戴式裝置…等,則我們可以將「required」的值設定為「false」。

此外,如果當我們在「Manifest」文件中宣告「Leanback」,通常編譯器會提醒我們加入另外一個設備聲明:「Touchscreen」,如下圖:

該標籤是針對「螢幕觸控」的聲明,「TV」雖然擁有「螢幕觸控」不多,但至少還是有這樣的產品,但「Set Top Box」基本上是完全不可能配置「觸控螢幕」,因此,這個聲明算是必要的聲明。

「Android TV」的硬體配置

上述的「Touchscreen」,就是硬體配置的一種;就如同「Touchscreen」一樣,所有的硬體配置方式都是藉由「<uses-feature >」標籤來設定,而其必要的屬性有兩個。

其分別為「name」和「required」;而「name」所填入的值,我們稱之為「功能描述字串」,如「android.hardware.touchscreen」;而「required」因為上述文章已經談過了,就不重複了。

可配置的硬件表如下:

關於硬體配置宣告項目建議,Google 是這樣說的:「Declares a single hardware or software feature that is used by the application.」,如下圖:

會這樣建議其實還是跟「STB」的硬體規格有關,畢竟「STB」的硬體規格並不像手機,事實上,一台標準型且合格的「STB」它可以不具備多項功能,包含觸控螢幕、相機、GPS、電話…等。

因此,Google 才會希望我們明確的標示出硬體規格的需求

實際上,為了因應各種不同的需求,我們通常會在「Minifest」清單中皆預設為「false」,然後「在程式執行到需要的硬體項目的時候在藉由程式碼進行判斷」,甚至也可以「判斷現在是否正運行在 Android TV 的設備」上。

事實上,若我們的 APP 執行一定需要其中的某項功能,那我們也可以直接將該參數設為「True」。

但要注意的是,如果我們將某項硬體配置設為「Ture」,則其它沒有該硬體的裝置就不能安裝我們的應用程式了。

Android TV 的佈景主題

與「Phone APPs」一樣,佈景主題是決定整體 APPs 的風格,不過比起手機項目琳瑯滿目的佈景主題,「Android TV APPs」能選擇的佈景題相對就少許多,就兩種,分別是「Leanback 主题背景」和「NoTitleBar 主题背景」。

「Leanback」主题背景

「Leanback」主題,是專門針對「Android TV APPs」所設計的佈景主題。

其設計理念與 Android TV 一致,該佈景主題屬於「AndroidX」下的套件,同此它也是 Google 強烈建議使用的「Android TV APPs」佈景主題,其設定方式如下圖:

上圖橘色部份的內容,就是筆者在前面文章中曾提到過的,簡單的說,就是繼承的類別為「Activity」,而非「AppCompatActivity」。

「NoTitleBar」主题背景

該主題其實就是一般「Phone APPs」的主題,但其主要色調、設計概念或架構皆不符合「Android TV」的架構,因此,在非不得以的情況下,並不建議使用它。

那什麼是非不得以的情況?

因為「Leanback」是屬於「AndroidX」的套件,它是比較新的內容,因此,在某些舊的專案中並沒有導入它。

然後,有一點要特別注意,由於「Android TV」並沒有支援「action bar」,因此我們必須將主題設置為「NoTitleBar」,如下圖:

事實上,「AndroidX」所提供的「TV」元件非常多,可以參考此連結,如下圖:

備註:「AndroidX」是 Google 整合「Android Support Library」後,並經過重構的新庫,其目的為取代後者,此外,後者已經不再維護。

其它佈局該注意事項

除了佈景主題外,Google 在「TV APPs」的 UI 設計上也有許多建議與規範。

其中包含「基礎佈局」、「邊界保留」、「文本規範」、「廣告規範」和「佈局資源的處理」…等,同時,Google 在文件中也有說明「該避免的布局方式」。

但這些主要都跟「UI/UX」的設計比較相關,筆者就不再本文中作過多著墨,筆者僅介紹其中幾項與程式設計比較相關的,如下:

大尺寸圖片的處理

事實上,圖片處理在 Android 一直都是危險的事情,它相當的耗損資源,有時候一不小心就造成「OutOfMemory」的錯誤,因此圖片的處理一直都是 Android 開發者該學習的課題;在「Phone APPs」的開發上,畢竟手機的螢幕相對小,因此我們可以在圖檔的解析動手腳,使其大小降低,以減少載入時記憶體的損耗。

但 Android TV 不同,相較於手機,其功能相對少,因此多數「STB」的記憶體並不會太大,此外,Android TV 的螢幕又相對大,圖檔解析亦不能太過壓縮;因此,圖檔的處理是相對重要的。

那要如何處理呢?我會建議依賴套件就好,像是「Picasso」、「Glide」等,像是官方就推薦「使用『Glide』來處理圖片」。

應避免使用的佈局元件

在官方文件中僅提到「ActionBar」和「ViewPager」這兩個元件應避免使用。前者是「Android TV」本身就不支援,而後者則是需要依賴「螢幕觸控」。

但根據筆者的經驗,除上述兩者外,還有些元件是可以使用,但容易有使用者體驗不好的情況,但這比較牽扯到個人感受度,筆者就不舉例了。

不提供「網路瀏覽器」

此外,還有一項很重要的,Android TV 是不提供「網路瀏覽器」的,如果要導向網頁,我們僅能藉由實作 WebView 的方式,如下圖:

電視的管理控制器

談完了「盒子端」,接著我們來談論「遙控器端」。

在此處,我只有一件事想要談論,就是「遙控器的斷開連接事件」。

事實上,這是正常的「Activity」的機制,在手機上,當執行階段期間進行變更,如「改變螢幕方向」、「鍵盤可用性」、「語言」…等,Android 會重新啟動執行中的 Activity,因此設計者通常會對此進行一些「處理」。

上述是「Android」本身的機制,因此,「Android TV」同樣無法避免。

但不同的是,在正常情況下,「Android TV」僅需要處理「鍵盤可用性改變,例如藍芽遙控器連線。」的部份。

而解決方式為在 Activity 中加入「configChanges」的屬性,如下:

android:configChanges="keyboard|keyboardHidden|navigation"

控制導航

與手機的螢幕觸控不同,「Android TV」是藉由遙控器來進行操作,兩者相比之下,遙控器式的操作似乎更缺乏了直覺,為了彌補此缺陷,Google 便提出「導航機制」與「焦點式」的設計方式,而這部份是屬於「UI/UX」的範疇,如需詳細了解,請參閱「面向 TV 的設計模式」。

總結

事實上,關於「Android TV APPs」的設計,這篇僅是個入門參考,還有不少細節的部份是文章中沒有提到的。

最後,本篇內容就到此,感謝各位看倌們的閱讀。

--

--

RICK
RICK

Written by RICK

當遇到重開機無法解決的 BUG 時,那就試試關機吧。

No responses yet