【Android】android TV開發

google翻譯[https://www.jianshu.com/p/c216849986ed]

Ⅰ。開始使用電視應用

爲了使您的應用在電視設備上獲得成功,您必須設計出可以在10英尺遠的地方輕鬆理解的新佈局,並提供僅使用方向鍵和選擇按鈕即可進行導航的功能。

確定媒體格式支持

先決條件

宣佈電視活動

打算在電視設備上運行的應用程序必須在清單中聲明電視的啓動器活動。它使用CATEGORY_LEANBACK_LAUNCHER意向過濾器來執行此操作。此過濾器會將您的應用標識爲已啓用電視功能,並讓Google Play將其標識爲電視應用。當用戶在其電視主屏幕上選擇您的應用程序時,此意圖將標識要啓動的活動。

<application
  android:banner="@drawable/banner" >
  ...
  <activity
    android:name="com.example.android.MainActivity"
    android:label="@string/app_name" >

    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
  </activity>

  <activity
    android:name="com.example.android.TvActivity"
    android:label="@string/app_name"
    android:theme="@style/Theme.Leanback">

    <intent-filter>
      <action android:name="android.intent.action.MAIN" />
      <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
    </intent-filter>

  </activity>
</application>

在此示例中,第二個活動清單條目將該活動指定爲要在電視設備上啓動的活動。

Caution: If you do not include the CATEGORY_LEANBACK_LAUNCHER intent filter in your app, it is not visible to users running Google Play on TV devices. Also, if your app does not have this filter when you use developer tools to load it onto a TV device, the app does not appear in the TV user interface.

如果您要修改現有的應用程序以在電視上使用,則您的應用程序不應在電視上使用與手機和平板電腦相同的活動佈局。電視應用程序的用戶界面(或現有應用程序的電視部分)應提供更簡單的界面,以便使用沙發上的遙控器輕鬆導航。

聲明Leanback支持

聲明您的應用使用Android TV所需的Leanback用戶界面。如果您要開發在移動設備(手機,可穿戴設備,平板電腦等)以及Android TV上運行的應用程序,請將必需的屬性值設置爲false。如果將required屬性值設置爲true,則您的應用程序將僅在使用Leanback UI的設備上運行。

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

無需聲明觸摸屏

旨在在電視設備上運行的應用程序不依賴於觸摸屏進行輸入。爲了清楚起見,您的電視應用程序清單必須聲明不需要android.hardware.touchscreen功能。此設置將您的應用標識爲可以在電視設備上運行,並且在Google Play中將其視爲電視應用是必需的。下面的代碼示例演示如何包含此清單聲明:

<manifest>
    <uses-feature android:name="android.hardware.touchscreen"
              android:required="false" />
    ...
</manifest>

提供主屏幕橫幅

如果應用程序包括Leanback啓動器意圖過濾器,則它必須爲每個本地化提供主屏幕橫幅圖像。標語是在應用程序和遊戲行的主屏幕上顯示的應用程序啓動點。要將橫幅添加到您的應用程序,請在清單中描述橫幅,如下所示:

<application
    ...
    android:banner="@drawable/banner" >
    ...
</application>

android:banner屬性與<application>標記一起使用可爲所有應用程序活動提供默認橫幅,或與<activity>標記一起使用可爲特定活動提供橫幅。

標語應該是大小爲320 x 180像素的xhdpi資源。圖像中必須包含文本。如果您的應用程序支持多種語言,則必須爲橫幅廣告提供單獨的版本,併爲每種受支持的語言提供文字。

更改啓動器顏色

啓動電視應用程序時,系統會顯示一個類似於擴大的實心圓的動畫。要自定義此動畫的顏色,請將電視應用或活動的android:colorPrimary屬性設置爲特定顏色。您還應該將兩個其他過渡重疊屬性設置爲true,如主題資源XML文件中的以下片段所示:

<resources>
    <style ... >
      <item name="android:colorPrimary">@color/primary</item>
      <item name="android:windowAllowReturnTransitionOverlap">true</item>
      <item name="android:windowAllowEnterTransitionOverlap">true</item>
    </style>
</resources>

添加電視支持庫

  • v17 leanback庫 -爲電視應用程序提供用戶界面小部件,特別是對於執行媒體播放的應用程序。
  • v7 recyclerview庫 -提供用於以節省內存的方式管理長列表顯示的類。v17 leanback庫中的幾個類取決於此庫中的類。
  • v7 Cardview庫 -提供用於顯示信息卡(如媒體項目圖片和說明)的用戶界面小部件。
    Note: You are not required to use these support libraries for your TV app. However, we strongly recommend using them, particularly for apps that provide a media catalog browsing interface.
    如果您決定對您的應用程序使用v17 leanback庫,則應注意它取決於 v4支持庫。因此,使用leanback支持庫的應用程序必須包括以下支持庫:
  • v4支持庫
  • v7 recyclerview支持庫
  • v17 leanback支持庫
  • 構建電視播放應用程序 -電視是爲了娛樂而構建的,因此Android提供了一組用戶界面工具和小部件,用於構建可播放視頻和音樂並允許用戶瀏覽所需內容的電視應用程序。
  • 幫助用戶在電視上找到您的內容 -觸手可及的所有內容選擇,幫助他們找到自己喜歡的內容幾乎與提供該內容一樣重要。本培訓討論如何在電視設備上顯示內容。

運行電視應用

在真實設備上運行

1.使用USB電纜將電視設備連接到開發機。如果需要,請參閱設備製造商提供的文檔。
2.在電視設備上,導航至設置。
3.在設備行中,選擇關於。
4.向下滾動至“生成”,然後選擇“生成”幾次,直到出現消息“您現在是開發人員!”。
5.返回設置。在“首選項”行中,選擇“開發人員選項”。
6.選擇調試> USB調試,然後選擇打開。
7.導航回到電視主屏幕。

在虛擬設備上運行

  1. 啓動AVD管理器。有關更多信息,請參見AVD Manager幫助。
  2. 在“ AVD管理器”對話框中,單擊“ 設備定義”選項卡。
  3. 選擇一個Android TV設備定義,然後單擊創建AVD
  4. 選擇仿真器選項,然後單擊“ 確定”以創建AVD。

二,處理電視硬件

電視硬件與其他Android設備有很大不同。電視不包括其他Android設備上的某些硬件功能,例如觸摸屏,相機和GPS接收器。電視也完全依賴於輔助硬件設備。爲了使用戶與電視應用程序進行交互,他們必須使用遙控器或遊戲板。爲電視構建應用程序時,必須仔細考慮硬件限制和在電視硬件上運行的要求。

聲明電視的硬件要求

Android應用程序可以在應用清單中聲明硬件功能要求,以確保不會在未提供這些功能的設備上安裝它們。如果您要擴展現有的應用程序以在電視上使用,請仔細檢查您的應用程序清單,瞭解是否有任何硬件要求聲明,這些聲明可能會阻止將其安裝在電視設備上

<uses-feature android:name="android.hardware.touchscreen"
        android:required="false"/>
<uses-feature android:name="android.hardware.faketouch"
        android:required="false"/>
<uses-feature android:name="android.hardware.telephony"
        android:required="false"/>
<uses-feature android:name="android.hardware.camera"
        android:required="false"/>
<uses-feature android:name="android.hardware.nfc"
        android:required="false"/>
<uses-feature android:name="android.hardware.location.gps"
        android:required="false"/>
<uses-feature android:name="android.hardware.microphone"
        android:required="false"/>
<uses-feature android:name="android.hardware.sensor"

**Note:** Some features have subfeatures like *android.hardware.camera.front*, as described in the [Feature reference](https://developer.android.google.cn/guide/topics/manifest/uses-feature-element.html#features-reference). Be sure to mark as *required="false"* any subfeatures also used in your app.
Caution: Declaring a hardware feature as required by setting its value to true prevents your app from being installed on TV devices or appearing in the Android TV home screen launcher.

低功耗模式下暫停播放

當用戶關閉設備時,某些電視設備支持低功耗模式。該設備沒有關閉電源,而是禁用了顯示功能,並使Android TV在後臺運行。在此模式下仍會啓用音頻輸出,因此當設備處於低功耗模式時,您的應用應停止當前正在播放的任何內容。

爲避免在低功耗模式下播放,請覆蓋[onStop()](https://developer.android.google.cn/reference/android/app/Activity.html#onStop())並停止任何當前播放的內容:

@Override
public void onStop() {
  // App-specific method to stop playback
  stopPlayback();
  super.onStop();
}

Ⅲ。手柄控制器斷開

電視控制器通常是藍牙設備,可能會通過定期進入睡眠模式並與電視設備斷開連接來嘗試節省電量。這意味着如果未將應用程序配置爲處理這些重新連接事件,則該應用程序可能會中斷或重新啓動。這些事件可能在以下任何情況下發生:

在觀看長達幾分鐘的視頻時,D-Pad或遊戲控制器進入睡眠模式,與電視設備斷開連接,然後稍後重新連接。
在玩遊戲的過程中,新玩家使用當前未連接的遊戲控制器加入遊戲。
在玩遊戲期間,玩家離開遊戲並斷開遊戲控制器的連接。
必須將受斷開連接和重新連接事件影響的任何TV應用程序活動配置爲處理應用清單中的重新連接事件。以下代碼示例演示瞭如何使活動能夠處理配置更改,包括鍵盤或導航設備的連接,斷開或重新連接:

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:configChanges="keyboard|keyboardHidden|navigation"
  android:theme="@style/Theme.Leanback">

  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
  </intent-filter>
  ...
</activity>

通過此配置更改,應用程序可以通過重新連接事件繼續運行,而不是通過Android框架重新啓動,這不是良好的用戶體驗。

處理按鈕事件

當用戶單擊控制器上的按鈕時,您的應用程序會收到一個帶有KeyEvent的事件。該按鈕的預期行爲可能是媒體事件(例如播放,暫停或停止),也可能是電視類型的事件(例如選擇或導航)。爲了提供良好的用戶體驗,您的應用應爲控制器按鈕分配一致的行爲。

電視用戶界面事件

生成這些KeyEvent的按鈕應由應用根據下表處理。

按鍵事件 行爲
BUTTON_B,返回 背部
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTER 選拔
DPAD_UP,DPAD_DOWN,DPAD_LEFT,DPAD_RIGHT 導航

媒體活動

當用戶觀看媒體時,應根據下表由應用處理生成這些KeyEvent的按鈕。如果您的應用正在控制MediaSession,則應調用TransportControls以下方法之一。請注意,在這種情況下,選擇按鈕充當“播放/暫停”按鈕。

按鍵事件 TransportControls呼叫 行爲
BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTER pause()
BUTTON_START,BUTTON_SELECT,BUTTON_A,ENTER,DPAD_CENTER,KEYCODE_NUMPAD_ENTER pause() 暫停
BUTTON_R1 skipToNext() 跳到下一個
BUTTON_L1 skipToPrevious() 跳到上一個
DPAD_RIGHT,BUTTON_R2,AXIS_RTRIGGER,AXIS_THROTTLE fastForward() 快進
DPAD_LEFT,BUTTON_L2,AXIS_LTRIGGER,AXIS_BRAKE rewind() 倒帶
沒有KeyEvent與Stop關聯) stop() 停止

四,電視的佈局

通常從大約10英尺遠的地方觀看電視屏幕,儘管它比大多數其他Android設備顯示屏大得多,但這種類型的屏幕無法提供與較小設備相同的精確細節和色彩。這些因素要求您在考慮電視設備的情況下創建應用佈局,以便創建有用且令人愉快的用戶體驗。

在電視上使用佈局主題

瘦背主題

V17的Leanback支持庫包括Theme.Leanback,電視活動,提供了一個一致的視覺風格的主題。我們強烈建議在使用v17 leanback類構建的任何電視應用中使用此主題。以下代碼示例顯示如何將此主題應用於活動:

<activity
  android:name="com.example.android.TvActivity"
  android:label="@string/app_name"
  android:theme="@style/Theme.Leanback">

**Caution:**後傾主題不包括操作欄,因爲Android TV應用程序中沒有。如果您的應用程序使用支持片段,例如BrowseSupportFragment,則您的活動必須擴展FragmentActivity。不要使用試圖使操作欄主題化併產生錯誤的AppCompatActivity

java.lang.RuntimeException: Unable to start activity ComponentInfo{...} :
java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this
activity.

NoTitleBar主題

標題欄是手機和平板電腦上的Android應用程序的標準用戶界面元素,但不適用於電視應用程序。如果您不使用v17 leanback類,則應將此主題應用於電視活動,以禁止顯示標題欄。電視應用清單中的以下代碼示例演示瞭如何應用此主題來刪除標題欄的顯示:

<application>
  ...

  <activity
    android:name="com.example.android.TvActivity"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.NoTitleBar">
    ...

  </activity>
</application>

建立基本的電視版面

電視設備的佈局應遵循一些基本準則,以確保它們在大屏幕上可用並有效。請遵循以下提示,以構建針對電視屏幕優化的景觀佈局:

  • 以橫向放置佈局。電視屏幕始終以橫向模式顯示。
  • 將屏幕上的導航控件放在屏幕的左側或右側,並保留內容的垂直空間。
  • 使用Fragments創建分爲幾部分的UI ,並使用GridView之類的視圖組代替ListView來更好地利用水平屏幕空間。
  • 使用諸如RelativeLayoutLinearLayout之類的視圖組來排列視圖。這種方法允許系統將視圖的位置調整爲電視屏幕的大小,對齊方式,長寬比和像素密度。
  • 在佈局控件之間添加足夠的邊距,以避免UI混亂。

過掃描

用戶必須始終可見的屏幕元素應放置在過掃描安全區域內。在佈局中的左右邊緣分別增加5%的空白量48dp,在頂部和底部邊緣增加27dp的邊距可確保該佈局中的屏幕元素位於過掃描安全區域內。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   >

   <!-- Screen elements that can render outside the overscan safe area go here -->

   <!-- Nested RelativeLayout with overscan-safe margin -->
   <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:layout_marginTop="27dp"
       android:layout_marginBottom="27dp"
       android:layout_marginLeft="48dp"
       android:layout_marginRight="48dp">

      <!-- Screen elements that need to be within the overscan safe area go here -->

   </RelativeLayout>
</RelativeLayout>

**Caution:** Do not apply overscan margins to your layout if you are using the v17 leanback classes, such as瀏覽片段or related widgets, as those layouts already incorporate overscan-safe margins.

構建可用的文本和控件

TV應用程序佈局中的文本和控件應易於查看並可以遠距離瀏覽。請遵循以下提示,使您的用戶界面元素更容易從遠處看到:

  • 將文本分成小塊,用戶可以快速掃描。
  • 在深色背景上使用淺色文字。這種樣式更容易在電視上閱讀。
  • 避免使用輕量級字體或筆觸既很窄又很寬的字體。使用簡單的sans-serif字體和抗鋸齒功能可提高可讀性。
  • 使用Android的標準字體大小:
    <TextView
          android:id="@+id/atext"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:gravity="center_vertical"
          android:singleLine="true"
          android:textAppearance="?android:attr/textAppearanceMedium"/>

     

  • 確保所有視圖小部件都足夠大,以使坐在離屏幕10英尺遠的人可以清楚看到(對於超大屏幕,此距離更大)。做到這一點的最佳方法是使用相對於佈局的大小而不是絕對大小,並且使用密度無關的像素(dip)單元而不是絕對像素單元。例如,要設置窗口小部件的寬度,請使用wrap_content而不是像素測量,併爲窗口小部件設置邊距,請使用dip值而不是px值。

有關可處理更大屏幕尺寸的與密度無關的像素和建築物佈局的更多信息,請參閱支持多屏幕

管理電視的佈局資源

普通的高清電視顯示分辨率爲720p,1080i和1080p。您的電視佈局應將屏幕尺寸設置爲1920 x 1080像素,然後允許Android系統在必要時將佈局元素縮小爲720p。通常,縮小尺寸(刪除像素)不會降低佈局顯示質量。但是,升級可能會導致顯示僞像,從而降低佈局質量,並對應用程序的用戶體驗產生負面影響。
爲了獲得最佳的圖像縮放效果,請儘可能將其作爲9補丁圖像元素提供。如果在佈局中提供低質量或較小的圖像,則它們將出現像素化,模糊或顆粒狀,這對用戶而言不是很好的體驗。請改用高質量的圖像。

處理大位圖

電視設備與其他任何Android設備一樣,具有有限的內存量。如果您使用非常高分辨率的圖像構建應用程序佈局,或者在應用程序的操作中使用許多高分辨率圖像,則它可能會很快遇到內存限制並導致內存不足錯誤。爲避免這些類型的問題,請遵循以下提示:

  • 僅當圖像顯示在屏幕上時才加載圖像。例如,當在GridViewGallery中顯示多個圖像時,僅在視圖的Adapter上調用getView()時才加載圖像。
  • 在不再需要的位圖視圖上調用recycle()
  • 使用WeakReference將對Bitmap對象的引用存儲在內存中的Collection中
  • 如果從網絡上獲取圖像,請使用AsyncTask`來獲取圖像並將其存儲在設備上,以加快訪問速度。永遠不要在應用程序的主用戶界面線程上進行網絡事務。
  • 在下載大圖像時,將其按比例縮小到更合適的尺寸;否則,下載映像本身可能會導致內存不足異常。
    有關在處理圖像時獲得最佳性能的更多信息,請參閱有效顯示位圖

避免佈局反圖案

有幾種構建佈局的方法應避免使用,因爲它們不能在電視設備上很好地工作並導致不良的用戶體驗。這是一些在開發電視版面時應該使用的用戶界面方法。

  • 重用手機或平板電腦的佈局 -未經修改,請勿重用手機或平板電腦應用中的佈局。爲其他Android設備形狀尺寸構建的佈局不太適合電視設備,應簡化在電視上的操作。
  • ActionBar-儘管建議在手機和平​​板電腦上使用此用戶界面約定,但不適用於電視界面。特別是,強烈建議不要使用操作欄選項菜單(或與此相關的任何下拉菜單),因爲很難用遙控器瀏覽這樣的菜單。
  • ViewPager-在屏幕上滑動可在手機或平板電腦上很好地工作,但不要在電視上嘗試!

有關設計適合電視的佈局的更多信息,請參閱電視設計指南。

提供有效的廣告

對於起居室環境,我們建議您使用全屏並在30秒內將其停用的視頻廣告解決方案。必須使用D-pad(而非觸摸板)訪問Android TV上的廣告功能(例如關閉按鈕和點擊)。

Android TV不提供網絡瀏覽器。您的廣告不得嘗試啓動網絡瀏覽器或重定向到未經Android TV設備批准的Google Play商店內容。
**Note:** You can use the網頁瀏覽class for logins to services like Google+ and Facebook.

五,創建電視導航

Note: You should only use these attributes to modify the navigation order if the default order that the system applies does not work well.
下面的代碼示例演示如何定義下一個控件以接收TextView佈局對象的焦點:

<TextView android:id="@+id/Category1"
        android:nextFocusDown="@+id/Category2"\>

下表列出了Android用戶界面小部件的所有可用導航屬性:

屬性 功能
nextFocusDown 定義當用戶向下導航時接收焦點的下一個視圖。
nextFocusLeft 定義當用戶向左導航時接收焦點的下一個視圖。
nextFocusRight 定義當用戶向右導航時接收焦點的下一個視圖。
nextFocusUp 定義下一個視圖,以在用戶向上導航時獲得焦點。

要使用這些顯式導航屬性之一,請將其值設置爲佈局中另一個小部件的ID(android:id值)。您應該將導航順序設置爲循環,以便最後一個控件將焦點引導回第一個。

提供清晰的重點和選擇

電視上的應用程序導航方案的成功取決於用戶確定屏幕上關注的用戶界面元素的難易程度。
您的應用佈局和實現應使用顏色,大小,動畫或這些屬性的組合,以幫助用戶輕鬆確定下一步可以採取的措施。使用統一的方案來指示整個應用程序的焦點。

六。請求後臺播放

通常,當用戶單擊“ 主頁”以顯示電視啓動器時,活動會暫停。但是,您的應用可以請求後臺播放,其中活動將繼續在電視啓動器後面播放。

要請求後臺播放,請調用requestVisibleBehind()。如果活動停止可見,請確保清理媒體資源。例如,如果requestVisibleBehind()返回false表示請求失敗,或者系統調用對onVisibleBehindCanceled()的覆蓋,則應該釋放媒體資源。

@Override
public void onPause() {
  super.onPause();
  if (mVideoView.isPlaying()) {
    // Argument equals true to notify the system that the activity
    // wishes to be visible behind other translucent activities
    if (! requestVisibleBehind(true)) {
      // App-specific method to stop playback and release resources
      // because call to requestVisibleBehind(true) failed
      stopPlayback();
    }
  } else {
    // Argument equals false because the activity is not playing
    requestVisibleBehind(false);
  }
}

@Override
public void onVisibleBehindCanceled() {
  // App-specific method to stop playback and release resources
  stopPlayback();
  super.onVisibleBehindCanceled();
}

**The methodrequestVisibleBehind()was deprecated in API level 26.** It will be removed in a future release. The functionality described on this page is not supported in Android version 8.0 and later.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章