2015年3月21日 星期六

Android TV 入門

前陣子公司某個產品線開發 Android TV 的版本時和同事一起 survey 了有關 Android TV 的 Leanback API,趁著記憶還在寫篇筆記。

在 Nexus Player 上市前,還有另一款叫 ADT-1 開發套件是 Google 所開發的硬體,也就是工程版的 Nexus Player,提供給第一波跟著 Android TV 一起上市的合作廠商申請。在 Nexus Player 推出前雖然市面上很多以 Android 為基礎的電視盒、電視棒,這些都是其他廠商所推出作業系統為 Android 的機上盒,控制器與操作習慣並未統一。而市售的 Google 官方 Android TV 作業系統目前只有 Nexus Player 一台裝置,但官網中有提示接下來 Sony、Sharp 等廠商也將推出 Android TV 的設備

Android TV 的設備因為具有完整的環境,所以現有的 mobile/tablet App 不需要經過改寫就可以 deploy 到 Nexus Player 上執行,但官方的 TV Controller 的按鍵只有五向鍵、首頁及返回、播放,在沒有觸控的情況下並不適合將現有 App 直接執行於 TV 上,何況大部份的 App 並不會多花時間處理 focus 的順序,直接上架後無法正常使用的問題想必不少。

若要讓用戶方便的使用這幾顆按鍵操作 App,可以參考目前官方建議的 Design Guideline。目前最快速設計出符合規範的方式是使用 Google 所推出的 Leanback Library,比較需要注意的是一旦使用了 Leanback Library 之後,應用程式的 minSDK 至少需要是 17。

為現有的 App 加入 Android TV 有兩種方式,第一種是增加一個 Activity 並將其指定為 LEANBACK_LAUNCHER 並在 application 加入 android:banner 的 attribute 如下

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:banner="@drawable/app_banner" <!-- 這是 TV 上的 App Icon -->
        android:theme="@style/AppTheme" >
</application>
<activity
    android:name=".TVMainActivity"
    android:screenOrientation="landscape" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
    </intent-filter>
</activity>

這種方式即可實現在同一個 apk 下,於 mobile、tablet 開啟時走原本的 LAUNCHER Activity,而在 Nexus Player 上走 LEANBACK_LAUNCHER Activity 的效果,直接從啟動的入口導至不同操作介面。但需要注意一點,上架為 TV App 前你可能會在 AndroidManifest 加入下列描述,這種情況可能會使你的 App 消失在 Google Play 上面,必須修改為 required="false" 才對。

<uses-feature android:name="android.software.leanback" android:required="true" />

另一個加入 TV Support 的方法是在 Android Studio 中替專案加入一個新的 TV module 管理電視上的所有資源,在使用 Leanback Library 需將 minSDK 調至 17 的前提下,增加 TV module 似乎是個比較有彈性的做法,這樣專案的 mobile module 就可以維持著原本 min 14 或其他更低的版本號。但因為 TV module 和原有的 mobile module 分屬不同的 module 且都是 Application Project 故不適合互相 reference,多花時間把共用的 class 抽離到另一個 Android Library 的 module 是必須額外進行的工作,另一方面,這種方式所產出的是兩個 apk 而非一個 apk ( 我們產品目前是用這種方式,彈性較大 )。

因為上架到 TV Play 的應用程式大多數是影視、音樂類型的服務,所以如果想要做出和官方 App 中例如 Play、Youtube 一樣的 Layout 時,大致上離不開 Leanback Library 的 BrowseFragment, SearchFragment, DetailFragment, PlayFragment 這幾個類別,這幾個 Fragment 在我的 Slide 中有簡單的介紹:http://www.slideshare.net/itsAscii/android-tv-44018038

除了熟悉幫助製作 App 的 Leanback Library 之外,善用 Android TV 首頁上的推薦內容也是提高 App 使用量的重要手法,而 TV 首頁上的推薦內容事實上每一則都是由個別的 App 所發出來的 notification,所以不需要經過任何的審核或檢查制度,任何時候都可以將內容 Push 到 TV 的首頁引導用戶進入你的 App 觀看某些內容或播放某張歌單,在這個方便及自由的制度下其實反倒要更小心控制 Push 資訊的數量,如果太常將不重要或是不具吸引力的資訊推到首頁上擠壓到其他資訊,反而會造成用戶將你的 App 移除以換取乾淨的首頁。至於將資訊呈現到首頁的範例如下

NotificationManager mNotificationManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);

Notification notification = new NotificationCompat.BigPictureStyle(
        new NotificationCompat.Builder(getApplicationContext())
                .setContentTitle("Recommend Title")
                .setContentText("Recommend Description")
                .setPriority(4)
                .setLocalOnly(true)
                .setOngoing(true)
                .setColor(getApplicationContext().getResources().getColor(R.color.primary))
                .setCategory("recommendation")
                .setLargeIcon(/* get a Bitmap */)
                .setSmallIcon(/* get a drawable */)
                .setContentIntent(/* get a new Intent */)
                .setExtras(/* get a new Bundle */))
        .build();

mNotificationManager.notify(count, notification);

關於發送 Recommandation 到首頁的流程,官方的教學也特別建議可以在接到 BOOT_COMPLETED Intent 時啟動 Service 在背景處理固定推送資訊的流程:http://developer.android.com/training/tv/discovery/recommendations.html#run-service

上次在某個活動介紹 Android TV 入門時剛好主辦單位有錄影,所以順便附上:https://livehouse.in/channel/180868/record/-JgkFK-PoqisXwjeJ5AW



沒有留言:

張貼留言