Android Wear Simples passos para oferecer suporte à wearables.

Slides:



Advertisements
Apresentações semelhantes
Sistemas distribuídos
Advertisements

Objetos Implícitos Contextuais
1.
Programação Básica em Java
Diagrama de Classes.
Introdução a EJB 3.0 Eduardo Martins Guerra Instituto Tecnológico de Aeronáutica Curso de Pós-Graduação em Engenharia de Software Programação Distribuída.
Métodos Programação II 1 Métodos de Programação II (Mestrado Integrado em Engenharia de Comunicações) 1º Ano, 2º Semestre Elementos de Classe, class wrappers.
Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro Fabrício Firmino de Faria.
Curso de Android Fevereiro de 2011 Cristiano Expedito Ribeiro
Revisão da Linguagem C.
+ Curso de Android XVIII Jornada de Cursos Persistência.
Instalação e Configuração
Concorrência em Java Threads em Java.
Sistema de Gerenciamento de Pessoas e Projetos
Capítulo 2 Java Servlets.
Laboratório de Programação I Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Sistemas Operacionais
+ Curso de Android XVIII Jornada de Cursos Criando aplicações Android (cont.)
Chamada Remota de Procedimentos
Desenvolvimento para Android Aula 7 - Services
Instalação  A tela abaixo é a primeira a aparecer durante a instalação do Caché 5. O diretório selecionado será usado para salvar alguns arquivos usados.
Programa Expresso de Capacitação Módulo J2ME Aula 5 – Record Management System.
Diagramas de Atividade
Guia de Abertura de Chamado
MICROSOFT Windows XP.
Orientação a Objetos e Java Graduação em Ciência da Computação
Pilhas Profa. Nádia Félix.
Ambiente Virtual de Aprendizagem
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Listas Simplesmente Encadeadas
Programação para Dispositivos Móveis
Redes Sociais Colaborativas Patrícia Ramos | 22/05/2006.
Java Kickstart, day 2 Semelhanças com linguagem C.
Bancos de Dados Estrutura e Funcionamento de um SGBD
Bruno Inojosa MCP.NET Framework.NET com C#. Aula V  Tópicos abordados:  Desenvolvendo para internet (Parte III) Gerenciamento de Estados User Controls.
Introdução ao aplicativo Lync da Windows Store Lync 2013.
Laboratório de Programação
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Moodle Residência Agrária Introdução para professores e Monitores Prof. Liziany Müller Andréia Lima.
Certificação Marco Antonio. Introdução A compreensão desse capítulo é muito importante pois trata de um assunto essencial em qualquer linguagem de programação,
Aula Prática 5 Monitoria IP/CC (~if669). Roteiro 1. 1.Recursão 2. 2.Escopo de Variáveis 3. 3.Arrays 4. 4.Strings.
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Unidade 5 – Integrando JSP e Servlets Prof.: Henrique Santos
Encontrar e entrar em uma sala de chat Use a pesquisa do Lync para encontrar salas às quais você tenha acesso. Referência Rápida do Lync 2013 Chat Persistente.
Faculdade Pitágoras – Campus Fadom.  Display  Cada MIDlet tem UMA referência para um objeto Display  Esse objeto pode recuperar informações sobre.
Bruno Inojosa MCP .NET Framework
1 BSP no InteGrade II WorkShop do InteGrade c. 2 Objetivo O principal objetivo é permitir que aplicações BSP sejam executadas no InteGrade sem ou com.
Conceitos do Cliente Funcionamento Básico do Cliente Como Clientes acessam e usam Objetos Distribúidos.
NA AULA DE HOJE VEREMOS A TRANSIÇÃO ENTRE ACTIVITYS. CRIE UM PROJETO COM O NOME TRANSICAO, A SEGUIR MONTE SUA ACTIVITY COMO A ABAIXO :
Feapa Prof Osiel Marlon Disciplina: Engenharia de Software 2009 Curso: Sistemas de Informação.
COMPUTAÇÃO MÓVEL Prof.: Jean Carlo Mendes
Programação para Dispositivos Móveis 03 – Activity e Intent.
COMPUTAÇÃO MÓVEL Prof.: Jean Carlo Mendes
Introdução JavaScript
Montado o diretório. Crie uma pasta sem conteúdo.
Programação para Web I AULA 2 BANCO DE DADOS.
Tudo sobre listas em Android
1 AJAX em aplicações Rails Lívia Monnerat Castro
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
ASP.NET Passo a Passo Criando um CRUD Conteúdo do Capítulo 1. Acessar bancos de dados SQL Server 2. Utilizar o GridView 3. Utilizar o DetailView 4. Implementar.
Iniciando outras atividades. Intent INTENT = intenção? É um objeto-mensageiro usado para solicitar uma ação e mandar dados para alguma outra atividade.
ASP.NET Passo a Passo Controles com Processamento Personalizado Criando um controle personalizado 1. Abra ou copie a solução ControlORama desenvolvido.
Curso: Redes de Computadores Turno: Noturno Disciplina: Introdução a Sistemas Abertos Professor: Jean Galdino Componentes: Andresa Maria Camilla Priscilla.
Strings e Arrays Prof. Gustavo Wagner (Alterações) Prof. Tiago Massoni (Slides Originais) Desenvolvimento de Sistemas FATEC-PB  Centro de Informática,
Escolha uma nova senha: Escolha uma pergunta secreta e a resposta para essa pergunta:
ProgramaçãoConcorrente Glêdson Elias
Primeiros passeios no código Java para Android. Manifest
Programação para Android Prof. Rone Ilídio - UFSJ
Transcrição da apresentação:

Android Wear Simples passos para oferecer suporte à wearables

Sobre mim Paula Caroline da Rosa Mecatrônica Indutrial / Mestrado em Mecatrônica Curso de Android - GlobalCode

Motivação – Fluxograma da Tristeza

Wearables  São dispositivos que interagem com os smartphones;  Bluetooth;  Wifi  Dispositivos:  Lg SmartWatch  Motorola 360  Samsung gear  Lançados no Google IO 2014;  Permitem uma interação do usuário, sem que ele precise interagir com smartphone (interações rápidas ou micro interações)

Interações com usuário NotificaçõesComandos de Voz Aplicações / sensoresSincronização de dados

Notificações Simples  Qualquer notificação gerada é enviada para ao wearables (desde que a versão do Smartphone seja android 4.4+)  Tipos de Notificações:  Notificações Simples  Notificações com ações  Notificações Big picture style  Notificações focadas em wearables  Respostas por voz  Opções default:  Abrir no Smartphone;  Bloquear App;

Notificações Simples RequestCode (int)flags(int) RequestCode (int)

Notificações com Ações  Permite interagir com a notificação sem necessidade de interagir com smartphone;  Possibilita uma ação rápida;  Deixa o usuário satisfeito

Notificações com Ações

Notificações – Big Picture style e Inbox style Big PictureInbox Style NotificationCompat.BigPictureStyle bigPicStyle = new NotificationCompat.BigPictureStyle();

NotificationCompat.Builder notification = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_launcher).setContentTitle("Título").setContentText("Este é o texto de uma notificação").setContentIntent(pendingIntent).addAction(curtirAction).extend(extender); Notificações Wearables  Uma extensão para customizações de notificações que são específicas para os wearables – Wearable Extender;  São aplicáveis somente a wearables;  Permitem maior customização das notificações focadas em wearables, e coexistem com as notificações para smartphones; Somente Wearable Somente Smartphone NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender().setHintHideIcon(true).setBackground(bitmap).addAction(actionWearable); NotificationCompat.Action actionWearable = new NotificationCompat.Action( R.mipmap.ic_launcher, "Curtir Wear", pendingIntentWear); *setLocalOnly(boolean) para notificação não ser enviada ao wearable

Exibição em Páginas  Exibe o conteúdo em páginas;  Contém um indicador dar um feedbak ao usuário da página atual, bem como quantas paginas restam;  As páginas aparecem à direita da notificação;  Com o gesto de swipe o usuário navega nas informações;  Exemplo: Google Now

Exibição em Páginas (...)

Exibição em Pilha (Stack)  A informação é exibida em pilha (cards empilhados);  Contém informação de quantos cards empilhados existem;  Ao clicar no item (+1 card) os cards são expandidos, sendo exibidos em uma espécie de lista;

Notificação em Pilha (Stack) Notification notificacao1= new NotificationCompat.Builder(this).setContentTitle("Notificacao 1").setContentText("Conteúdo do 1").setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(icon).setGroup("Group").build(); manager.notify(0, notificacao1); Notification notificacao2= new NotificationCompat.Builder(this).setContentTitle("Notificacao 2").setContentText("Conteúdo do 2").setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(icon).setGroup("Group").build(); manager.notify(1, notificacao2); NotificationCompat.InboxStyle style = new + "novos Notification sumario = new NotificationCompat.Builder(this).setContentTitle("sumario titulo").setContentText("sumario content texto").setSmallIcon(R.mipmap.ic_launcher).setGroup("Group").setGroupSummary(true).setStyle(style).extend(extender).build(); manager.notify(2, sumario); NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender().setBackground(icon);

Notificações – respostas à ações via comandos de voz  Usados nas notificações para que o usuário possa responder uma notificação via comandos de voz;  Definição de um input de voz  Passa-se um array de Strings para um objeto RemoteInput  Mensagens pré-definidas:  Cria-se um recurso string-array passando-as no método setChoice(String[])  Permite que o usuário utilize respostas rápidas

Notificações: respostas via comandos de voz NotificationCompat.Action actionWearable = new NotificationCompat.Action.Builder( R.mipmap.ic_launcher, "Responder", pendingIntent).addRemoteInput(gerarRespostaVoz()).build(); NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender().setHintHideIcon(true).addAction(actionWearable); NotificationCompat.Builder notification = new NotificationCompat.Builder(this).setSmallIcon(R.mipmap.ic_launcher).setContentTitle("Título 2").setContentText("Este é o texto de uma notificação, em pilha").setContentIntent(pendingIntent).extend(extender); private RemoteInput gerarRespostaAutomatica() { String[] respostas = getResources().getStringArray(R.array.respostas); return new RemoteInput.Builder(EXTRA_RESPOSTAS_VOZ).setLabel("Respostas!").setChoices(respostas).build(); } Cria um objeto do tipo RemoteInput passando um array de strings Passa o remoteInput criado no método addRemoteInput(RemoteInput) Adiciona-se a ação ao objeto extender (pois deve ser uma ação wearable) Adiciona-se o extender à notificação

Obtendo input de voz  Permite capturar o input de resposta (voz ou resposta pré-definida) e utilizar o dado na aplicação;  É uma funcionalidade útil em aplicativos de conversa (whatsapp, hangouts) Bundle input = RemoteInput.getResultsFromIntent(getIntent()); if(input != null) { resposta = input.getCharSequence(EXTRA_RESPOSTAS_VOZ).toString(); }

Android Wear API´s Node API Data API Message API Watch Face API Maps API Capability API

Trabalhando com API´s  Podem ser acionadas tanto no smartphone quanto no wear;  Necessitam conectar com Google Play Services;  Dados trafegados são privados;  Servem para sincronizar dados entre smartphone e wearables; compile 'com.google.android.gms:play-services-wearable:7.5.0'  Recomendação: conectar Google Play Services no método onStart e desconectar no onStop; private GoogleApiClient googleApiClient() { GoogleApiClient client = new GoogleApiClient.Builder(this).addApi(Wearable.API).addConnectionCallbacks(connectionCallbacks).addOnConnectionFailedListener(failedListener).build(); return client; }

Trabalhando com API´s private GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() public void onConnected(Bundle bundle) { public void onConnectionSuspended(int i) { } }; private GoogleApiClient.OnConnectionFailedListener failedListener = new GoogleApiClient.OnConnectionFailedListener() public void onConnectionFailed(ConnectionResult connectionResult) { } }; Adicionando callback de conexão: Adicionando callback de falha de conexão:

Node API  Permite saber quando um dispositivo se conectou ou desconectou;  Permite também saber quais os dipositivos conectados atualmente;  Pode estar associada a outras API´s

Node API private void nodeConnection() { Wearable.NodeApi.addListener(googleApiClient(), new NodeApi.NodeListener() public void onPeerConnected(Node node) { boolean isNear = node.isNearby(); String nodeId = node.getId(); String name = node.getDisplayName(); public void onPeerDisconnected(Node node) { } }); } private void getConnectedNodes() { Wearable.NodeApi.getConnectedNodes(googleApiClient()).setResultCallback( new ResultCallback () public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) { Node connectedNode = getConnectedNodesResult.getNodes().get(0); } } ); } Detectando conexão de um nó: Obter os nós conectados:

Message API  Dados:  Payload: ByteArray de 100kb (permite serialização /deserialização);  Path: uma única String, iniciando com “/” (exemplo: “/path/data”)  Não há sincronização, e sim um envio em uma direção (“one-way communication mechanism);  Exemplo: abrir uma activity via wearable;  Exemplo: receber uma confirmação do usuário

Message API Enviando uma mensagem: private void receiveMessage() { Wearable.MessageApi.addListener(googleApiClient(), new MessageApi.MessageListener() public void onMessageReceived(MessageEvent messageEvent) { byte[] dado = messageEvent.getData(); System.out.println("Log data: " + dado); } }); } Recebendo uma mensagem: if (getConnectedNodes().isNearby()) { Wearable.MessageApi.sendMessage( googleApiClient(), getConnectedNodes().getId(), "/mensagens", new byte[]{3, 2, 1});

Data API  Funciona como um repositório: permite inserir, alterar, remover dados;  Informa quando houver alteração ou exclusão de dados;  Permite fluxo de dados em ambos os sentidos  device  wearable  wearable  device  Utiliza uma string como endereço: “/dados”

Data API – Envio de dados Cria-se um objeto PutDataMapRequest passando um path (string) Define o envio Envia o dado PutDataMapRequest mapRequest = PutDataMapRequest.create("/exemplogdg"); Passa-se os objetos PutDataRequest request = mapRequest.asPutDataRequest(); Wearable.DataApi.putDataItem(client, request).setResultCallback(new ResultCallback () public void onResult(DataApi.DataItemResult dataItemResult) { if (dataItemResult.getStatus().isSuccess()) { Log.i("sucesso", "--> OK"); } else { Log.i("falha", "--> NOK"); } } }); Verifica Envio mapRequest.getDataMap().putInt("userId", id); mapRequest.getDataMap().putString("userPhoneNumber", name);

Data API – Recebimento de dados Cria-se uma instância de GooglePlayServices protected void onStart() { super.onStart(); client.connect(); } Conecta-se Google Play public void onConnected(Bundle bundle) { Wearable.DataApi.addListener(client, this); } Adiciona listener de protected void onPause() { Wearable.DataApi.removeListener(client, this); client.disconnect(); super.onPause(); } Remove listener de DataApi e desconecta Google Play public void onCreate() { super.onCreate(); googleApiClient(); }

Data API – Recebimento de dados Percorre o objeto public void onDataChanged(DataEventBuffer dataEventBuffer) { for (DataEvent dataEvent : dataEventBuffer) { Condição para dados que foram atualizados Obtem-se a Uri que teve alteração de dados Dados excluídos } else if(dataEvent.getType() == DataEvent.TYPE_DELETED) { //Dados que foram excluídos } if(dataEvent.getType() == DataEvent.TYPE_CHANGED) { DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap(); String path = dataEvent.getDataItem().getUri().getPath(); int id = dataMap.getInt("userId"); String nome = dataMap.getString("userPhoneNumber"); if(path.equals("/exemplogdg")) { Envio dados

Wearable Listener Service  Recebe eventos de outros nós, como mudança de dados, envio de mensagem e mudanças de conectividade;  O ciclo de vida do service é gerenciado pelo Android Wear;  É indicado quando há necessidade de executar um evento em background;  Situações onde há uma activity aberta não necessitam do Service, e podem ser executadas implementando as interfaces citadas anteriormente;  onBind(Intent)  onChannelClosed(Channel, int closeReason, int erro) /onChannelOpened(Channel)  onDataChanged(DataEventBuffer)  onCreate() / onDestroy()  onMessageReceived(MessageEvent)  onPeerConnected(Node) / onPeerDisconnected(Node)

Wearable Listener public void onDataChanged(DataEventBuffer dataEvents) { for(DataEvent dataEvent : dataEvents) { if(dataEvent.getType() == DataEvent.TYPE_CHANGED) { DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap(); String path = dataEvent.getDataItem().getUri().getPath(); Log.i("log path: ", "-->" + path); if(path.equals("/exemplogdg")) { int id = dataMap.getInt("userId"); String nome = dataMap.getString("userPhoneNumber"); } } } }

Wearable Layouts  WatchViewStub    App:roundLayout  BoxInsetLayout – layout adaptável para telas retangulares e circulares;  Cards  FrameLayout – Troca de CardFragment em tempo de execução (na activity)  CardScrollView  FrameLayout - WearableListView.Item (interface)  Telas de confirmação - DelayedConfirmationView

Rodando aplicação  Vá até o path de instalação da sdk e vá no diretório platform-tools  Instala-se o aplicativo Android Wear no device, para fazer o pareamento.

Referências  Maps API   Curso Android Wear – Udacity   Watch Faces   Android Developers   Contato:  