Ok, Google. O que é
+Nelson Glauber
@nglauber
nglauber.blogspot.com
Android Wear?
Nelson Glauber
Engenheiro de Sistemas do C.E.S.A.R.
Professor da Unibratec
Google Developer Expert
@nglauber
+NelsonGlauber
www.nglauber.com.br
Conhecendo o Android Wear
125 vezes ao dia em média!!!
Vida real
Pega o telefone
Devagando no telefone
Mais tempo para interagir com as pessoas à sua volta
Serve para que?
Android Wear estende a
plataforma Android para uma
nova geração de dispositivos,
com uma usabilidade
desenhada especificamente
para os wearables.
UI baseada em um
stream de cards
Clima Trânsito Lembretes Vôos
Batimentos
Cardíacos
Atender/rejeitar
ligações
Busca por
voz
Navegação Música
Navegação
sem mobile
Música sem
mobile
Lembretes
Voice
memos
UX para wear
NÃO é UX para
um (mini)
smartphone
http://minuum.com/typing-on-android-wear/
Lançadas
automaticamente
Glanceable
Princípios de UI
Sugestão e
demanda
Micro-interações
Princípios de UI
Não interrompa o usuário… Crie grandes áreas de toque
Não seja um
“shoulder tapper"
Comandos de voz
Desenvolvendo para Android Wear
Android Wear
Device
O que precisamos?
Android Studio
Escolha seu modelo
LG
G Watch R
Motorola
Moto 360
LG Watch 

Urban Silver
Escolha seu modelo
Asus
ZenWatch
LG G Watch
Samsung
Gear Live
Sony
SmartWatch 3
O que precisamos?
Android Wear App
adb -d forward tcp:5601 tcp:5601
Depuração USB ou Bluetooth
adb forward tcp:4444 localabstract:/adb-hub; adb connect localhost:4444
Estrutura de um app wear
Notificações simples
Notificações contextuais
Estrutura de um app wear
2D Picker
Estrutura de um app wear
2D Picker
Estrutura de um app wear
1. Exibe um card 2. Clica na ação do
card
3. Exibe activity em
full-screen
4. Quando a
activity terminar,
volta ao fluxo de
cards
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Notificações simples
Notificações com ação
Notificações com ação
✓ Se quiser a ação no mobile e no wearable,
use a classe NotificationCompat.Action.
✓ Se quiser a ação apenas no wearable use o
método addAction(Action) da classe
NotificationCompat.WearableExtender.
Notificações empilhadas
Notificações com páginas
Detalhes sobre notificações…
✓ Notificações disparadas pelo mobile, são
exibidas no mobile e no wear, mas são
executadas no mobile.

✓ Notificações disparadas pelo wear, só são
exibidas e executadas no wear.

✓ Você pode exibir notificações apenas no
mobile ou apenas no wear.
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Respondendo com voz
Comandos de voz
Call me a car/taxi Take a note
Set alarm for 8 AM Set timer for 10 minutes
Start/stop bike Start/stop a run
Start/stop workout Show heart rate
Show step count App Name :)
https://developer.android.com/training/wearables/apps/voice.html
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Aplicações Wear
MinhaApp
MobileAPK WearAPK
Dependências
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
wearApp project(':wear')
compile 'com.android.support:appcompat-v7:21.0.2'
compile 'com.google.android.gms:play-services-wearable:+'
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.google.android.support:wearable:1.1.0'
compile 'com.google.android.gms:play-services-wearable:+'
}
WatchViewStub
BoxInsetLayout
WearableListView
CircledImageView
GridViewPager
GridPagerAdapter
FragmentGridPagerAdapter
CardFragment
DelayedConfirmationView
ConfirmationActivity
DismissOverlayView
Componentes
android.support.wearable.view
Tela Quadrada ou Redonda?
Tela Quadrada ou Redonda?
BoxInsetLayout
<android.support.wearable.view.WatchViewStub
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/watch_view_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:rectLayout="@layout/rect_activity_main_wear"
app:roundLayout="@layout/round_activity_main_wear">
</android.support.wearable.view.WatchViewStub>
res/layout/rect_activity_main_wear.xml
res/layout/round_activity_main_wear.xml
WearableListView
WearableListView
WearableListView.ClickListener
WearableListView.Adapter
CircledImageView
GridViewPager
GridViewPager
GridPagerAdapter
FragmentGridPagerAdapter
CardFragment
CardFrame
DelayedConfirmationView
DelayedConfirmationView
<android.support.wearable.view.DelayedConfirmationView
android:id="@+id/delayed_confirm"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/cancel_circle"
app:circle_border_color="@color/lightblue"
app:circle_border_width="4dp"
app:circle_radius=“16dp"/>
DelayedConfirmationView mDelayedView =
(DelayedConfirmationView) findViewById(R.id.delayed_confirm);
mDelayedView.setListener(
new DelayedConfirmationView.DelayedConfirmationListener(){
@Override
public void onTimerFinished(View view) {
}
@Override
public void onTimerSelected(View view) {
}
});
ConfirmationActivity
Intent intent = new Intent(context, ConfirmationActivity.class);
intent.putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE,
ConfirmationActivity.SUCCESS_ANIMATION);
intent.putExtra(ConfirmationActivity.EXTRA_MESSAGE,
getString(R.string.msg_sent));
context.startActivity(intent);
DismissOverlayView
<style name="AppTheme" parent="Theme.DeviceDefault">
<item name="android:windowSwipeToDismiss">false</item>
</style>
Notificações
Sincronizadas
Comandos
de Voz
Aplicações
Wear
Envio e sincronização
de dados
APIs
Comunicação Mobile/Wear
MinhaApp
MobileAPK WearAPK
Google Play Services
GoogleApiClient googleApiClient =
new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.addConnectionCallbacks(cc)
.addOnConnectionFailedListener(cfl)
.build();
compile ‘com.google.android.gms:play-services:7.3.0’
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Node API
Message API
Data API
Channel API
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(
new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult result) {
Node node = result.getNodes().get(0);
}
});
Wearable.NodeApi.addListener(
mGoogleApiClient, new NodeApi.NodeListener() {
@Override
public void onPeerConnected(Node node) {
}
@Override
public void onPeerDisconnected(Node node) {
}
});
Node API
Wearable.MessageApi.sendMessage(mGoogleApiClient,
node.getId(), "/mensagens", new byte[]{ 1, 2, 3 } );
Message API
Wearable.MessageApi.addListener(mGoogleApiClient,
new MessageApi.MessageListener() {
@Override
public void onMessageReceived(MessageEvent messageEvent) {
String remetente = messageEvent.getSourceNodeId();
String caminho = messageEvent.getPath();
byte[] dados = messageEvent.getData();
}
});
PutDataMapRequest putDataMapRequest =
PutDataMapRequest.create("/dados");
DataMap dataMap = putDataMapRequest.getDataMap();
dataMap.putInt("numero", 1);
dataMap.putString("nome", "Glauber");
Wearable.DataApi.putDataItem(
mGoogleApiClient,
putDataMapRequest.asPutDataRequest());
Data API
Wearable.DataApi.addListener(mGoogleApiClient,
new DataApi.DataListener() {
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent dataEvent : dataEvents){
if (dataEvent.getType() == DataEvent.TYPE_CHANGED){
DataMapItem dataMapItem =
DataMapItem.fromDataItem(dataEvent.getDataItem());
Uri uri = dataMapItem.getUri();
if (uri.getPath().equals("/dados")) {
DataMap dataMap = dataMapItem.getDataMap();
int numero = dataMap.getInt("numero");
String nome = dataMap.getString("nome");
}
}
}
}
});
Data API
WearableListenerService
extends Service
implements
NodeApi.NodeListener,
MessageApi.MessageListener,
DataApi.DataListener
Node API
Message API
Data API
<service android:name=“br.com.nglauber.nextlevelapps.MeuService”>
<intent-filter>
<action
android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
</intent-filter>
</service>
Permite conectar múltiplos devices!!!
Streamming e Envio de arquivos!!!
7.3
Channel API
WatchFaces
Funcionar em telas redondas e quadradas
Pense no modo interativo e ambiente
Use preto e branco para telas
OLED em modo ambiente e
mantenha 95% dos pixels pretos
Acomode bem os
elementos do sistema
Adicione configurações ao
aplicativo do Android Wear
http://lifehacker.ru/2014/10/29/google-fit-dlya-android-prevrashhaem-smartfon-v-fitness-treker/
Informações diárias:
Quantidade de passos.
Quantas calorias
consumidas.
Atividade física.
https://developers.google.com/fit/android/get-started
Dúvidas?
http://developer.android.com/training/building-wearables.html
Nelson Glauber
Engenheiro de Sistemas do C.E.S.A.R.
Professor da Unibratec
Google Developer Expert
@nglauber
+NelsonGlauber
www.nglauber.com.br

Android Wear Androidos 2015