Android Wear — Introdução ao desenvolvimento com o emulador

Introdução

Já venho acompanhando a evolução do Android Wear desde o seu lançamento, sempre achei fascinante esse engajamento que o smartwatch pode proporcionar para as pessoas no dia a dia. Porém outra coisa que percebi junto à amigos desenvolvedores, é que a grande maioria ainda não tinha experimentado criar uma aplicação para o Android Wear. Por isso decidi criar este post para ajudar o pessoal a criar uma aplicação simples e testá-la com emulador do Android Wear.

Sobre o projeto

Neste post iremos criar um app para salvar nossas anotações, ele terá funcionalidades básicas, como adicionar, deletar e listar, e estes dados irão ser sincronizados entre o wearable e o telefone.

Configurações do projeto:

Para você poder seguir este post seu ambiente precisa estar com as seguintes configurações:

  • Android Studio 2.2
  • Emulador Android Wear API 24

Nosso primeiro passo será abrir o Android Studio e depois é só seguir as imagens para criação do projeto:

Não se esqueça de selecionar o checkbox WEAR para ser adicionado no projeto!

As configurações dos arquivos build.gradle (Wear & Mobile) devem estar desta maneira:

mobile/build.gradle

wear/build.gradle

Nosso primeiro passo será trabalhar na aplicação Wearable!

Vamos criar alguns layouts necessários para mostrar nossa lista de anotações:

activity_wear_main.xml

view_holder.xml

Próximo passo do projeto é criar um modelo Note.java para guarda as informações da nossa anotação:

Agora vamos criar um Adapter para popular nossa lista:

Na nossa WearMainActivity.java vamos criar um método configLayoutComponents() com a função de configurar nossos componentes e colocaremos ele no método onCreate:

Como este post visa a construção de um app simples, iremos realizar o armazenamento das anotações com o SharedPreferences, assim teremos uma solução mais simplificada para absorver o conceito de desenvolvimento do app wearable. Criaremos uma classe SharedPreferencesUtils para realizar esta tarefa:

Para adicionarmos anotações em nossa lista, vamos utilizar o EditText que já foi adicionado posteriormente na nossa WearMainActivity, mas agora precisamos capturar o texto digitado, salvá-lo e atualizar nossa lista:

Logo que adicionamos o item na lista e no SharedPreferences, mostramos uma mensagem de confirmação que o próprio sistema do wearable nos fornece, eu criei uma classe utils para nos ajudar:

Agora vamos criar uma classe WearDeleteActivity e seu layout para deletar nossas anotações. Teremos uma implementação do DelayedConfirmationView que funciona como um temporizador para confirmar ou cancelar a ação de excluir anotação.

wear/AndroidManifest.xml

activity_delete.xml

DeleteActivity.java

Quando clicarmos no item da lista iremos chamar a DeleteActivity, que irá mostrar o DelayedConfirmationView e caso ele não seja cancelado, retornamos para o método onActivityResult da WearMainActivity e removemos o nosso item selecionado:

Até aqui, conseguimos fazer o nosso app wearable salvar, deletar e listar nossas anotações, mas ainda precisamos implementar a parte que faz a sincronização dos dados entre o wearable e o telefone, e para isso precisamos desenvolver o aplicativo do telefone. Como aqui o nosso foco é o desenvolvimento wearable, o código do aplicativo para o telefone vai estar disponível no GitHub.


Agora, vamos começar a implementar a comunicação entre o wearable e o telefone e para isso precisamos utilizar a Data Layer API.

Data Layer API

A Data Layer API é uma configuração de dados de objetos que o sistema utiliza para sincronizar através da rede e notificar o aplicativo de algum evento importante.

Para escutar os eventos do Data Layer API, temos duas opções:

Em ambas das opções, nós sobrescrevemos os métodos de callback para tratarmos os eventos desejados.

GoogleApiClient

Ele é o principal ponto de entrada para a integração com o Google Play Services. No nosso caso, ele irá nos ajudar na integração da Data Layer API.

Agora vamos implementar o DataApi.DataListener no modulo WEAR:

Na classe WearMainActivity vamos implementar os callbacks DataApi.DataListener, GoogleApiClient.ConnectionCallbacks e GoogleApiClient.OnConnectionFailedListener:

No onCreate configuramos o GoogleApiClient e no onResume fazemos a conexão:

No callback onConnected do GoogleApiClient adicionamos o listener para o DataApi e apartir deste momento começamos a escutar os eventos na Data Layer API:

No método onDataChanged é onde recebemos os dados da Data Layer API. É nele que validamos e tratamos os dados, para nossa persistência ser atualizada:

Vamos criar um método que terá o papel de enviar os dados pela Data Layer API, vale lembrar que o PATH de envio deve estar igual no lado do receptor, para podemos validar se os dados que estamos recebendo é do device correto:

Agora vamos implementar o WearableListenerService no modulo MOBILE:

Na parte do app do telefone criamos uma classe WearListCallListenerService que estende WearListenerService para podermos receber os dados que foram envidados do wearable:

Finalizando!

Agora para realizar o teste no telefone físico é necessário seguir algumas etapas simples, para criar uma conexão com o emulador do wearable:

  1. Faça o download no telefone do aplicativo Android Wear pela Google Play Store.
  2. Abra o emulador do Wearable no PC.
  3. Conecte o cabo USB no telefone, vá até a pasta platform-tools do Android SDK, abra o terminal de comados e digite: adb -d forward tcp:5601 tcp:5601
  4. Agora abra o aplicativo Android Wear e selecione para se conectar com o emulador.

Obs: Toda vez que desconectar o telefone do USB, temos que rodar o comando adb -d forward tcp:5601 tcp:5601.

Bom, pessoal é isso ai, espero ter contribuído um pouco para dar aquele pontapé inicial e criar seu wearable app. Com isso abordamos os principais pontos para a comunicação entre o wearable e o telefone, enviando e recendo dados via a Data Layer API. Vale ressaltar que, se você enviar a mesma informação mais de uma vez, o onDataChanged irá ser chamado apenas na primeira vez. O projeto completo vai estar no GitHub.

Qualquer dúvida por favor deixe um comentário ou me procure no slack da comunidade.