Upload
talita-das-neves-malheiro
View
226
Download
0
Embed Size (px)
Citation preview
Android WearSimples 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ções Comandos 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 Picture Inbox 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;
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
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 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);
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 APIMessage API
Watch Face API Maps APICapability 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() { @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:
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 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:
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() { @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});
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 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);
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();}
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
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 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"); } } }
}
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 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
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
Contato: Twitter: @_paulacr Email: [email protected]