Como Desenvolver para Android TV?

Como Desenvolver app para Android TV

O que todos esper­avam está prestes a ser real­iza­do, jog­ar games como Clash of Clans no con­for­to da sua TV ago­ra ficou bem mais fácil !!! Foi pen­san­do nis­so e em muitas out­ras coisas que o Android TV veio pra ficar! Com­pran­do uma Android TV da Sony ou conectan­do sua TV atu­al à um NVDIA SHIELD é tudo o que você pre­cisa para entrar no mar­avil­hoso mun­do do Android TV.

Mas um Android TV não é ape­nas uma TV rodan­do Android?! É muito mais do que isso, além dos aplica­tivos nor­mais que você usa no dia a dia como Face­book e Youtube, tam­bém é pos­sív­el jog­ar jogos mul­ti­play­er em tela divi­di­da, espel­har a tela de seu smart­phone na tv, usar tecla­dos para redi­gir tex­tos, assi­s­tir seus filmes e séries favoritos através de stream­ing, etc.

Como Desen­volver para Android TV?

Da mes­ma for­ma que você desen­volve um app para smart­phones e tablets, tam­bém desen­volverá para TV. As difer­enças téc­ni­cas, obvi­a­mente, vão muito além da tela maior.

Começan­do com uma inter­face padrão difer­en­ci­a­da, sua apli­cação poderá disponi­bi­lizar seu con­teú­do na tela prin­ci­pal (assim apare­cen­do nas bus­cas), apre­sen­tar recomen­dações, exibir canais para livestreams e etc.

Para cada uma dessas fun­cional­i­dades, será necessário a imple­men­tação de inter­faces especí­fi­cas que só são disponíveis por bib­liote­cas exclu­si­vas, como a Recomen­da­tions e a Lean­back. Os req­ui­si­tos mín­i­mos são o SDK tools 24 e o Android 5.0 (API 21).

Regras bási­cas no Android, como sem­pre usar threads para bus­car dados via inter­net para não blo­quear a Thread UI tam­bém se apli­cam nor­mal­mente.

Pron­to pra começar ? Defi­na o tipo de aplica­ti­vo e imple­mente as funções ade­quadas para aque­le nicho especí­fi­co e elas são:

TV Play­backs

Esse tipo de aplica­ti­vo pode­ria ser con­sid­er­a­do o prin­ci­pal, pois geral­mente as pes­soas uti­lizam suas TV’s para assi­s­tir con­teú­dos, cer­to ? Há dois con­ceitos prin­ci­pais por trás de aplica­tivos do tipo play­backs: Catál­o­gos e Cartões.

Catál­o­gos são sim­ple­mente uma coleção de con­teú­dos em que o usuário nave­ga e escol­he qual exibir, como na figu­ra aci­ma; podem ser usa­dos da mes­ma for­ma que ListViews, os declaran­do e inserindo um Adapter com os dados, veja o exem­p­lo abaixo:

<fragment
      android:name="android.support.v17.leanback.app.BrowseFragment"
      android:id="@+id/browse_fragment"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      />

tv_activity.xml

private void buildRowsAdapter() {
    mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());

    for (int i = 0; i < NUM_ROWS; ++i) {
        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
                new StringPresenter());
        listRowAdapter.add("Media Item 1");
        listRowAdapter.add("Media Item 2");
        listRowAdapter.add("Media Item 3");
        HeaderItem header = new HeaderItem(i, "Category " + i, null);
        mRowsAdapter.add(new ListRow(header, listRowAdapter));
    }

    mBrowseFragment.setAdapter(mRowsAdapter);
}

Já os Cartões são os quadrad­in­hos apre­sen­ta­dos den­tro do Catál­o­go como mostram a imagem aci­ma, mas pos­suem a fun­cional­i­dade de exibir o vídeo ou até mes­mo abrir uma tela cheia com os detal­h­es do con­teú­do. São sim­ples Image­Card­View que são cri­adas por um Pre­sen­ter e incluí­dos no lugar daque­le String­P­re­sen­ter do exem­p­lo ante­ri­or.

Recomen­dações de Con­teú­dos

Uma car­ac­terís­ti­ca inter­es­sante é desen­volver aplica­tivos que exibam con­teú­dos logo na tela prin­ci­pal, sem a neces­si­dade de abrir sua apli­cação antes. Essa fun­cional­i­dade pode ser facil­mente imple­men­ta­da crian­do um serviço de recomen­dações e avis­ar o frame­work Android através de uma men­sagem. Para isso, vamos reuti­lizar já o nos­so Cartão que fize­mos ante­ri­or­mente e sim­ples­mente exibí-lo na lin­ha de recomen­dações, os pas­sos são:

Crie seu serviço de recomen­dações e o reg­istre
Crie novas recomen­dações con­tendo o Cartão com o con­teú­do
Mande uma men­sagem com a nova recomen­dação para o sis­tema Android

Jogos \o/

Nin­ten­do Wii U, pode dar adeus ao seu monopólio de duas telas pois Android TV veio pra ficar! Jogos podem faz­er o uso da TV e de out­ros dis­pos­i­tivos simultânea­mente, como um tablet que pode exibir out­ra tela difer­ente da TV. Out­ra coisa boa é poder sal­var o esta­do do jogo entre os diver­sos dis­pos­i­tivos, isso sig­nifi­ca que você pode começar a jog­ar um jogo no smart­phone enquan­to está no tron­in­ho na hora do almoço, con­tin­uá-lo no tablet den­tro do metrô e final­izá-lo na TV quan­do chegar em casa do tra­bal­ho. Atual­mente ape­nas a platafor­ma Android disponi­bi­liza taman­ha flex­i­bil­i­dade em questão de dis­pos­i­tivos difer­entes e mod­e­los de jogos.

Talvez a parte que dê mais tra­bal­ho em um jogo mul­ti-dis­pos­i­ti­vo é o geren­ci­a­men­to dos con­troles, já que smart­phones e tablets usam o toque e pela TV deve-se usar um con­t­role como esse da nvdia:

Como Desenvolver aplicativos para Android TV

Além do mais, jogos não podem mostrar uma men­sagem como “toque aqui para con­tin­uar”, aplica­tivos devem geren­ciar quan­do um novo con­t­role se desconec­tar ou for conec­ta­do e tam­bém devem prestar mui­ta atenção na con­sistên­cia de botões, por exem­p­lo, usar o botão “A” para sele­cionar e “B” para can­ce­lar como boa eti­que­ta.

Canais de TV

Da mes­ma for­ma que o Youtube tem seus canais, não pode­ria ser difer­ente por aqui. Aplica­tivos que usam o con­ceito de canais devem exibir seus con­teú­dos de for­ma semel­hante ao YouTube, Net­flix e afins… E eu men­cionei que o con­teú­do pode ser trans­mi­ti­do ao vivo ? Todo o proces­so fun­ciona assim:

Desenvolver app para Android TV

A apli­cação imple­men­ta um serviço para o TV Input usan­do um TVCon­tract que irá diz­er quais os canais disponíveis na sua apli­cação (sim pode ser mais de um), os pro­gra­mas den­tro de cada canal e até mes­mo infor­mações sobre leg­en­da e áudio alter­na­ti­vo.

<service android:name="com.example.sampletvinput.SampleTvInput"
    android:label="@string/sample_tv_input_label"
    android:permission="android.permission.BIND_TV_INPUT">
    <intent-filter>
        <action android:name="android.media.tv.TvInputService" />
    </intent-filter>
    <meta-data android:name="android.media.tv.input"
      android:resource="@xml/sample_tv_input" />
</service>

Manifest.xml

<tv-input xmlns:android="http://schemas.android.com/apk/res/android"
  <!-- Required: activity for setting up the input -->
  android:setupActivity="com.example.sampletvinput.SampleTvInputSetupActivity"
  <!-- Optional: activity for controlling the settings -->
  android:settingsActivity="com.example.sampletvinput.SampleTvInputSettingsActivity" />

sample_tv_input.xml

Os dados do seu canal são manip­u­la­dos de uma for­ma padroniza­da den­tro do lay­out da TV e neces­si­tam ser atu­al­iza­dos usan­do o TvCon­tract da seguinte for­ma:

Explore Treasure Mode

  1. Número do canal (COLUMN_DISPLAY_NUMBER)
  2. Icone (android:icon manifest.xml)
  3. Descrição do pro­gra­ma (COLUMN_SHORT_DESCRIPTION)
  4. Títu­lo do pro­gra­ma (COLUMN_TITLE)
  5. Logo do Canal (TvContract.Channels.Logo)
    • Use a cor #EEEEEE para não ficar estran­ho em vol­ta
    • Não incluir padding
ContentValues values = new ContentValues();

values.put(Channels.COLUMN_DISPLAY_NUMBER, channel.mNumber);
values.put(Channels.COLUMN_DISPLAY_NAME, channel.mName);
values.put(Channels.COLUMN_ORIGINAL_NETWORK_ID, channel.mOriginalNetworkId);
values.put(Channels.COLUMN_TRANSPORT_STREAM_ID, channel.mTransportStreamId);
values.put(Channels.COLUMN_SERVICE_ID, channel.mServiceId);
values.put(Channels.COLUMN_VIDEO_FORMAT, channel.mVideoFormat);

Uri uri = context.getContentResolver().insert(TvContract.Channels.CONTENT_URI, values);

Como Otimizar seu Aplicativo

Tela Principal Android TV

Tela prin­ci­pal do android TV, notem como o con­teú­do de algu­mas apli­cações apare­cem.

A bib­liote­ca mais impor­tante é a Lean­Back, ela que con­tém os diver­sos recur­sos inter­es­santes que são especí­fi­cos para o Android TV como por exem­p­lo, você pode mudar o plano de fun­do enquan­to o usuário nave­ga pela sua inter­face para dar aque­la sen­sação cin­e­matográ­fi­ca com a seguinte lin­ha de códi­go:

BackgroundManager.getInstance(this).setDrawable(drawable);

Geral­mente, para aplica­tivos que rodem tan­to em Android TV quan­to em smart­phones e tablets, é necessário ter declar­ações difer­entes para exibir a Activ­i­ty especí­fi­ca pra TV ou não:

<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>

Ou então desabil­i­tar o touch screen caso necessário:

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

Lay­out Deve Ser Difer­ente?
Uma dica bem útil é usar Frag­ments para dividir as seções do aplica­ti­vo que são mostradas na tela prin­ci­pal e quan­do o app for aber­to, mas ao invés de usar ListViews para apre­sen­tar coleções, opte por usar Grid­Views por causa da tela maior. Tam­bém como de praxe, use Rel­a­tive­Lay­outs para deixar os com­po­nentes se ajustarem auto­mati­ca­mente na tela maior.

Não se esqueçam que a TV está sem­pre no modo pais­agem, não dá pra girar ela né?

O Que Não Usar?
Não ten­ha preguiça e ree­scre­va seu lay­out do zero se estiv­er por­tan­do um aplica­ti­vo de smart­phone pra TV. Isso é necessário pois, como dito ante­ri­or­mente, muitos com­po­nentes não se encaix­am bem na TV, por exem­p­lo, View­Pager são muito legais por causa da ani­mação quan­do você desliza seu dedo na tela, mas como repro­duzir isso em uma TV? Vai ficar meio esquisi­to não acha ? Tam­bém não use Action­Bar com menus na TV pois as opções da apli­cação devem ser con­tro­ladas pelo con­t­role remo­to.

Out­ra coisa impor­tante é não ten­tar lançar um brows­er para nave­g­ação porque não é supor­ta­do. Web­Views são ok quan­do fazem parte do seu aplica­ti­vo, mas pági­nas exter­nas que não sejam serviços de sing-in como google mais e face­book não são bem vis­tos pela políti­ca da play store.

Considerações Finais

Dis­pos­i­tivos Android

A beleza da platafor­ma Android é jus­ta­mente a plu­ral­i­dade de dis­pos­i­tivos com difer­entes per­son­al­i­dades rodan­do os mes­mos aplica­tivos. Android TV não é nen­hu­ma exceção, emb­o­ra com difer­ente final­i­dade, ela cumpre o seu papel prin­ci­pal que é entre­gar con­teú­do.

Mas com tan­tos tipos de dis­pos­i­tivos, cada um com sua final­i­dade especí­fi­ca, fica difí­cil escr­ev­er um aplica­ti­vo uma vez e rodar em todos sem prob­le­mas. Para isso é necessário esta­b­ele­cer quais são as platafor­mas que ele vai rodar, e cri­ar car­ac­terís­ti­cas úni­cas que só rodarão em um ou em out­ro.

Como o Android TV tem vários aspec­tos dis­tin­tos (Canais, Recomen­dações, etc), há a neces­si­dade de cri­ar Activ­i­ties e lay­outs especí­fi­cos para TV usan­do o suporte que a bib­liote­ca Lean­back nos dá para max­i­mizar a exper­iên­cia do usuário nesse tipo especí­fi­co de dis­pos­i­ti­vo.

Para maiores infor­mações entre no site ofi­cial (android tv) através do link abaixo: https://www.android.com/intl/pt-BR_br/tv/

Posts Similares