O sonho que todos esperavam está prestes a ser realizado, jogar Clash of Clans no conforto da sua TV agora nunca foi tão fácil !!! Foi pensando nisso e em muitas outras coisas que o Android TV veio pra ficar! Comprando uma TV da Sony (2015) ou conectando sua TV atual à um NVDIA SHIELD é tudo o que você precisa para entrar no maravilhoso mundo do Android TV.

Mas um Android TV não é apenas uma TV rodando Android?! É muito mais do que isso, além dos aplicativos normais que você usa no dia a dia como Facebook e Youtube, também é possível jogar jogos multiplayer em tela dividida, espelhar a tela de seu smartphone na tv, usar teclados para redigir textos, assistir seus filmes e séries favoritos através de streaming, etc.

Como Desenvolver para Android TV?

Da mesma forma que você desenvolve um app para smartphones e tablets, também desenvolverá para TV. As diferenças técnicas, obviamente, vão muito além da tela maior.

Começando com uma interface padrão diferenciada, sua aplicação poderá disponibilizar seu conteúdo na tela principal (assim aparecendo nas buscas), apresentar recomendações, exibir canais para livestreams e etc.

Para cada uma dessas funcionalidades, será necessário a implementação de interfaces específicas que só são disponíveis por bibliotecas exclusivas, como a Recomendations e a Leanback. Os requisitos mínimos são o SDK tools 24 e o Android 5.0 (API 21).

Regras básicas no Android, como sempre usar threads para buscar dados via internet para não bloquear a Thread UI também se aplicam normalmente.

Pronto pra começar ? Defina o tipo de aplicativo e implemente as funções adequadas para aquele nicho específico e elas são:

TV Playbacks

TV Playbacks

Esse tipo de aplicativo poderia ser considerado o principal, pois geralmente as pessoas utilizam suas TV’s para assistir conteúdos, certo ? Há dois conceitos principais por trás de aplicativos do tipo playbacks: Catálogos e Cartões.

Catálogos são simplemente uma coleção de conteúdos em que o usuário navega e escolhe qual exibir, como na figura acima; podem ser usados da mesma forma que ListViews, os declarando e inserindo um Adapter com os dados, veja o exemplo 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);
}

TvActivity.java

Já os Cartões são os quadradinhos apresentados dentro do Catálogo como mostram a imagem acima, mas possuem a funcionalidade de exibir o vídeo ou até mesmo abrir uma tela cheia com os detalhes do conteúdo. São simples ImageCardView que são criadas por um Presenter e incluídos no lugar daquele StringPresenter do exemplo anterior.

Recomendações de Conteúdos

Uma característica interessante é desenvolver aplicativos que exibam conteúdos logo na tela principal, sem a necessidade de abrir sua aplicação antes. Essa funcionalidade pode ser facilmente implementada criando um serviço de recomendações e avisar o framework Android através de uma mensagem. Para isso, vamos reutilizar já o nosso Cartão que fizemos anteriormente e simplesmente exibí-lo na linha de recomendações, os passos são:

  1. Crie seu serviço de recomendações e o registre
  2. Crie novas recomendações contendo o Cartão com o conteúdo
  3. Mande uma mensagem com a nova recomendação para o sistema Android

Jogos \o/

Nintendo Wii U, pode dar adeus ao seu monopólio de duas telas pois Android TV veio pra ficar! Jogos podem fazer o uso da TV e de outros dispositivos simultâneamente, como um tablet que pode exibir outra tela diferente da TV. Outra coisa boa é poder salvar o estado do jogo entre os diversos dispositivos, isso significa que você pode começar a jogar um jogo no smartphone enquanto está no troninho na hora do almoço, continuá-lo no tablet dentro do metrô e finalizá-lo na TV quando chegar em casa do trabalho. Atualmente apenas a plataforma Android disponibiliza tamanha flexibilidade em questão de dispositivos diferentes e modelos de jogos.

Talvez a parte que dê mais trabalho em um jogo multi-dispositivo é o gerenciamento dos controles, já que smartphones e tablets usam o toque e pela TV deve-se usar um controle como esse da nvdia:

Controle Nvdia

Além do mais, jogos não podem mostrar uma mensagem como “toque aqui para continuar”, aplicativos devem gerenciar quando um novo controle se desconectar ou for conectado e também devem prestar muita atenção na consistência de botões, por exemplo, usar o botão “A” para selecionar e “B” para cancelar como boa etiqueta.

Canais de TV

Da mesma forma que o Youtube tem seus canais, não poderia ser diferente por aqui. Aplicativos que usam o conceito de canais devem exibir seus conteúdos de forma semelhante ao YouTube, Netflix e afins… E eu mencionei que o conteúdo pode ser transmitido ao vivo ? Todo o processo funciona assim:

Processo AndroidTV

A aplicação implementa um serviço para o TV Input usando um TVContract que irá dizer quais os canais disponíveis na sua aplicação (sim pode ser mais de um), os programas dentro de cada canal e até mesmo informações sobre legenda e áudio alternativo.

<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 manipulados de uma forma padronizada dentro do layout da TV e necessitam ser atualizados usando o TvContract da seguinte forma:

Explore Treasure Mode

  1. Número do canal (COLUMN_DISPLAY_NUMBER)
  2. Icone (android:icon manifest.xml)
  3. Descrição do programa (COLUMN_SHORT_DESCRIPTION)
  4. Título do programa (COLUMN_TITLE)
  5. Logo do Canal (TvContract.Channels.Logo)
    • Use a cor #EEEEEE para não ficar estranho em volta
    • 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 principal do android TV, notem como o conteúdo de algumas aplicações aparecem.

A biblioteca mais importante é a LeanBack, ela que contém os diversos recursos interessantes que são específicos para o Android TV como por exemplo, você pode mudar o plano de fundo enquanto o usuário navega pela sua interface para dar aquela sensação cinematográfica com a seguinte linha de código:

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

Geralmente, para aplicativos que rodem tanto em Android TV quanto em smartphones e tablets, é necessário ter declarações diferentes para exibir a Activity específica 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 desabilitar o touch screen caso necessário:

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

Layout Deve Ser Diferente?

Uma dica bem útil é usar Fragments para dividir as seções do aplicativo que são mostradas na tela principal e quando o app for aberto, mas ao invés de usar ListViews para apresentar coleções, opte por usar GridViews por causa da tela maior. Também como de praxe, use RelativeLayouts para deixar os componentes se ajustarem automaticamente na tela maior.

Não se esqueçam que a TV está sempre no modo paisagem, não dá pra girar ela né?

O Que Não Usar?

Não tenha preguiça e reescreva seu layout do zero se estiver portando um aplicativo de smartphone pra TV. Isso é necessário pois, como dito anteriormente, muitos componentes não se encaixam bem na TV, por exemplo, ViewPager são muito legais por causa da animação quando você desliza seu dedo na tela, mas como reproduzir isso em uma TV? Vai ficar meio esquisito não acha ? Também não use ActionBar com menus na TV pois as opções da aplicação devem ser controladas pelo controle remoto.

Outra coisa importante é não tentar lançar um browser para navegação porque não é suportado. WebViews são ok quando fazem parte do seu aplicativo, mas páginas externas que não sejam serviços de sing-in como google mais e facebook não são bem vistos pela política da play store.

Considerações Finais

Dispositivos Android

A beleza da plataforma Android é justamente a pluralidade de dispositivos com diferentes personalidades rodando os mesmos aplicativos. Android TV não é nenhuma exceção, embora com diferente finalidade, ela cumpre o seu papel principal que é entregar conteúdo.

Mas com tantos tipos de dispositivos, cada um com sua finalidade específica, fica difícil escrever um aplicativo uma vez e rodar em todos sem problemas. Para isso é necessário estabelecer quais são as plataformas que ele vai rodar, e criar características únicas que só rodarão em um ou em outro.

Como o Android TV tem vários aspectos distintos (Canais, Recomendações, etc), há a necessidade de criar Activities e layouts específicos para TV usando o suporte que a biblioteca Leanback nos dá para maximizar a experiência do usuário nesse tipo específico de dispositivo.

Mas, antes de percorrer caminhos mais complexos, busque aprender a desenvolver aplicativos do início ao fim. Se você quiser desenvolver aplicativos Android como profissional, dá só uma olhada nesse Treinamento Completo que foi preparado usando o Método COMPROVADO dos 4 Elementos do Desenvolvimento Android.

Até o próximo artigo!

Leia também


Fillipe Cordeiro
Fillipe Cordeiro

Engenheiro da computação e desenvolvedor de software a quase 10 anos, com experiência em tecnologias como Java, Python e Android. Agora, quero te ajudar a mergulhar no universo do Desenvolvimento Android.