Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Android wear

480 views

Published on

Slides da minha apresentação de Android Wear no meetup de Android do GDGSP #android #wear #dev #gdgsp

Published in: Mobile
  • Be the first to comment

Android wear

  1. 1. Android Wear Simples passos para oferecer suporte à wearables
  2. 2. Sobre mim Paula Caroline da Rosa Mecatrônica Indutrial Curso de Android - GlobalCode Nutrisoft Android Básico – Aula particular
  3. 3. Motivação – Fluxograma da Tristeza
  4. 4. 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)
  5. 5. Interações com usuário Notificações Comandos de Voz Aplicações / sensoresSincronização de dados
  6. 6. Notificações  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;
  7. 7. Notificações Simples RequestCode (int) flags(int) id
  8. 8. 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
  9. 9. Notificações com Ações
  10. 10. Notificações – Big Picture style e Inbox style Big Picture Inbox Style NotificationCompat.BigPictureStyle bigPicStyle = new NotificationCompat.BigPictureStyle();
  11. 11. 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
  12. 12. 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
  13. 13. Exibição em Páginas (...)
  14. 14. 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;
  15. 15. Notificação em Pilha (Stack) Notification notificacao1= new NotificationCompat.Builder(this) .setContentTitle("Notificacao 1") .setContentText("Conteúdo do email 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 email 2") .setSmallIcon(R.mipmap.ic_launcher) .setLargeIcon(icon) .setGroup("Group") .build(); manager.notify(1, notificacao2); NotificationCompat.InboxStyle style = new NotificationCompat.InboxStyle() .addLine("xxx@yyy.com") .addLine("xxx@zzz.com") .setBigContentTitle(0 + "novos emails") .setSummaryText("info@fhf.com"); 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);
  16. 16. 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
  17. 17. 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
  18. 18. 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(); }
  19. 19. Android Wear API´s Node API Data APIMessage API Watch Face API Maps APICapability API
  20. 20. 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; }
  21. 21. Trabalhando com API´s private GoogleApiClient.ConnectionCallbacks connectionCallbacks = new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle bundle) { } @Override public void onConnectionSuspended(int i) { } }; private GoogleApiClient.OnConnectionFailedListener failedListener = new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult connectionResult) { } }; Adicionando callback de conexão: Adicionando callback de falha de conexão:
  22. 22. 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
  23. 23. Node API private void nodeConnection() { Wearable.NodeApi.addListener(googleApiClient(), new NodeApi.NodeListener() { @Override public void onPeerConnected(Node node) { boolean isNear = node.isNearby(); String nodeId = node.getId(); String name = node.getDisplayName(); } @Override public void onPeerDisconnected(Node node) { } }); } private void getConnectedNodes() { Wearable.NodeApi.getConnectedNodes(googleApiClient()).setResultCallback( new ResultCallback<NodeApi.GetConnectedNodesResult>() { @Override public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) { Node connectedNode = getConnectedNodesResult.getNodes().get(0); } } ); } Detectando conexão de um nó: Obter os nós conectados:
  24. 24. Message API  Dados: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
  25. 25. Message API Enviando uma mensagem: private void receiveMessage() { Wearable.MessageApi.addListener(googleApiClient(), new MessageApi.MessageListener() { @Override 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});
  26. 26. Data API  Funciona como um repositório temporá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”
  27. 27. 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<DataApi.DataItemResult>() { @Override 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);
  28. 28. Data API – Recebimento de dados Cria-se uma instância de GooglePlayServices (build) @Override protected void onStart() { super.onStart(); client.connect(); } Conecta-se Google Play Services @Override public void onConnected(Bundle bundle) { Wearable.DataApi.addListener(client, this); } Adiciona listener de DataApi @Override protected void onPause() { Wearable.DataApi.removeListener(client, this); client.disconnect(); super.onPause(); } Remove listener de DataApi e desconecta Google Play Services @Override public void onCreate() { super.onCreate(); googleApiClient(); }
  29. 29. Data API – Recebimento de dados Percorre o objeto DataEventBuffer @Override 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
  30. 30. 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)
  31. 31. Wearable Listener Service  Declara o service no Manifest <service android:name="com.example.deals.DataListenerService" android:enabled="true" android:exported="true" > <intent-filter> <action android:name= "com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service>
  32. 32. Wearable Listener Service @Override 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"); } } } }
  33. 33. Wearable Layouts  WatchViewStub  <android.support.wearable.view.WatchViewStub/>  App:rectLayout=“@layout/layout_retangular”  App:roundLayout =“@layout/layout_circular”  BoxInsetLayout – layout adaptável para telas retangulares e circulares;  Cards  FrameLayout – Troca de CardFragment em tempo de execução (na activity)  CardScrollView que contém um CardFrame  Telas de confirmação - DelayedConfirmationView
  34. 34. 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.
  35. 35. Referências  Maps API  https://developers.google.com/maps/documentation/android-api/wear  Curso Android Wear – Udacity  https://www.udacity.com/course/android-wear-development--ud875A  Watch Faces  https://www.youtube.com/watch?v=AK38PJZmIW8  Android Developers  https://developer.android.com/training/wearables/notifications/index.html  Livro  http://it-ebooks.info/book/4935/ (DE GRÁTISSSS)  Exemplo  https://github.com/paulacr/wearnotifications  Contato:  Twitter: @_paulacr  Email: paula.mecatronica@gmail.com

×