android wear

35
Android Wear Simples passos para oferecer suporte à wearables

Upload: paula-caroline-da-rosa

Post on 13-Apr-2017

373 views

Category:

Mobile


0 download

TRANSCRIPT

Page 1: Android wear

Android WearSimples passos para oferecer suporte à wearables

Page 2: Android wear

Sobre mim

Paula Caroline da Rosa

Mecatrônica Indutrial

Curso de Android - GlobalCode

Nutrisoft

Android Básico – Aula particular

Page 3: Android wear

Motivação – Fluxograma da Tristeza

Page 4: Android wear

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)

Page 5: Android wear

Interações com usuário

Notificações Comandos de Voz

Aplicações / sensoresSincronização de dados

Page 6: Android wear

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;

Page 7: Android wear

Notificações Simples

RequestCode (int) flags(int)

id

Page 8: Android wear

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

Page 9: Android wear

Notificações com Ações

Page 10: Android wear

Notificações – Big Picture style e Inbox style

Big Picture Inbox Style

NotificationCompat.BigPictureStyle bigPicStyle = new NotificationCompat.BigPictureStyle();

Page 11: Android wear

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;

SomenteWearable

SomenteSmartphone

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

Page 12: Android wear

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

Page 13: Android wear

Exibição em Páginas

(...)

Page 14: Android wear

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;

Page 15: Android wear

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("[email protected]") .addLine("[email protected]") .setBigContentTitle(0 + "novos emails") .setSummaryText("[email protected]");

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

Page 16: Android wear

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

Page 17: Android wear

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

Page 18: Android wear

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();}

Page 19: Android wear

Android Wear API´s

Node API Data APIMessage API

Watch Face API Maps APICapability API

Page 20: Android wear

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

Page 21: Android wear

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:

Page 22: Android wear

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

Page 23: Android wear

Node APIprivate 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:

Page 24: Android wear

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

Page 25: Android wear

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});

Page 26: Android wear

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”

Page 27: Android wear

Data API – Envio de dadosCria-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"); } } });

VerificaEnvio

mapRequest.getDataMap().putInt("userId", id);mapRequest.getDataMap().putString("userPhoneNumber", name);

Page 28: Android wear

Data API – Recebimento de dadosCria-se uma instância de GooglePlayServices (build)

@Overrideprotected void onStart() { super.onStart(); client.connect();}

Conecta-se Google Play Services

@Overridepublic void onConnected(Bundle bundle) { Wearable.DataApi.addListener(client, this);}

Adiciona listener de DataApi

@Overrideprotected void onPause() { Wearable.DataApi.removeListener(client, this); client.disconnect(); super.onPause();}

Remove listener de DataApi e desconecta Google Play Services

@Overridepublic void onCreate() { super.onCreate(); googleApiClient();}

Page 29: Android wear

Data API – Recebimento de dadosPercorre o objeto DataEventBuffer

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

Page 30: Android wear

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)

Page 31: Android wear

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>

Page 32: Android wear

Wearable Listener Service

@Overridepublic 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"); } } }

}

Page 33: Android wear

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

Page 34: Android wear

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.

Page 35: Android wear

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: [email protected]