SlideShare ist ein Scribd-Unternehmen logo
1 von 52
Downloaden Sie, um offline zu lesen
Ok Google, o que é 
? 
+Nelson Glauber 
@nglauber 
nglauber.blogspot.com
Android Wear estende a 
plataforma Android para uma 
nova geração de dispositivos, 
com uma usabilidade 
desenhada especificamente 
para os wearables.
Serve para que? 
Vida real 
Pega o telefone 
Devagando no telefone 
125 vezes ao dia em média!!! 
Mais tempo para interagir com as pessoas à sua volta
UI baseada em um 
stream de cards
Comandos de voz
Princípios de UI
Lançadas 
automaticamente 
Glanceable 
Sugestão e 
demanda
Não interrompa o usuário 
Grandes áreas de toque 
Micro-interações
O que precisamos?
O que precisamos? 
Android Studio 
0.8 
Google Play 
Services 
Android Wear 
Device
LG 
G Watch 
280x280, 512MB, 4GB, 400mAh 
Qualcomm Snapdragon 400 - 1.2Ghz 
Acelerômetro, Gyro, Compass 
Samsung 
Gear Live 
320x320, 512MB, 4GB, 300mAh 
Qualcom Snapdragon 400 - 1.2Ghz 
Acelerômetro, Gyro, Compass e Heart
Motorola 
Moto 360 
320x290, 512MB, 4GB, 320mAh 
TI OMAP 3 - 1.2Ghz 
Pedometer e Heart 
LG 
G Watch R 
320x320, 512MB, 4GB, 410mAh 
Qualcomm Snapdragon - 1.2Ghz 
Acelerometer, Gyro, Compass, 
Barometer e Heart
adb -d forward tcp:5601 tcp:5601
Android Wear Companion
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 
Imagem de 
Background 
Ícone da 
aplicação 
Título 
Texto
Notificações simples
Notificações simples 
PendingIntent pit = PendingIntent.getActivity( 
this, 0, new Intent(this, MainMobileActivity.class), 0); 
! 
Notification notification = new NotificationCompat.Builder(this) 
.setDefaults(Notification.DEFAULT_ALL) 
.setContentTitle("Notificação Simples") 
.setContentText("Texto da notificação") 
.setSmallIcon(R.drawable.ic_notificacao) 
.setLargeIcon(largeIcon) 
.setContentIntent(pit) 
.setAutoCancel(true) 
.build(); 
NotificationManagerCompat.from(this).notify(1000, notification);
Notificações com ação
Notificações com ação 
Intent itAgenda = new Intent(Intent.ACTION_VIEW); 
itAgenda.setData( 
Uri.parse("content://com.android.calendar/time")); 
PendingIntent pitAcao = 
PendingIntent.getActivity(this, 0, itAgenda, 0); 
! 
Notification notification = 
new NotificationCompat.Builder(this) 
// demais chamadas da notificação simples 
.addAction( 
new NotificationCompat.Action( 
R.drawable.ic_agenda, "Agenda", pitAcao)) 
.build();
Notificações em pilha
Notificações em pilha 
static int idNotificacao = 0; 
! 
Notification notification = new NotificationCompat.Builder(this) 
// demais chamadas da notificação simples 
.setContentTitle("Notificação Simples "+ ++idNotificacao) 
.setGroup("meuGrupo") 
.build();
NotificationCompat.WearableExtender extensionWear = 
new NotificationCompat.WearableExtender() 
.setBackground(largeIcon); 
! 
NotificationCompat.InboxStyle inboxStyle = 
new NotificationCompat.InboxStyle() 
.setBigContentTitle("Notificação em Pilha") 
.addLine("Várias mensagens não lidas") 
.setSummaryText("Resumo"); 
! 
Notification notificationSummary = 
new NotificationCompat.Builder(this) 
.setSmallIcon(R.drawable.ic_notificacao) 
.setStyle(inboxStyle) 
.extend(extensionWear) 
.setGroup("meuGrupo") 
.setGroupSummary(true) 
.build(); 
! 
NotificationManagerCompat nm = 
NotificationManagerCompat.from(this); 
! 
nm.notify(idNotificacao, notification); 
nm.notify(1000, notificationSummary);
Notificações com páginas
NotificationCompat.Builder notificationPage1 = 
new NotificationCompat.Builder(this) 
.setSmallIcon(R.drawable.ic_notificacao) 
.setContentTitle("Primeira Página") 
.setContentText("Essa é a primeira página") 
.setLargeIcon(largeIcon) 
.setAutoCancel(true) 
.setContentIntent(pit) 
.setDefaults(NotificationCompat.DEFAULT_ALL); 
! 
Notification notificationPage2 = 
new NotificationCompat.Builder(this) 
.setStyle(new NotificationCompat.BigTextStyle() 
.setBigContentTitle("Segunda página") 
.bigText("Essa é a segunda página")) 
.build(); 
! 
Notification notificationWithTwoPages = 
new NotificationCompat.WearableExtender() 
.addPage(notificationPage2) 
.extend(notificationPage1) 
.build(); 
! 
NotificationManagerCompat nm = 
NotificationManagerCompat.from(this); 
nm.notify(1000, notificationWithTwoPages);
Notificações 
Sincronizadas 
Comandos 
de Voz 
Aplicações 
Wear 
Envio e sincronização 
de dados 
APIs
Respondendo com voz
Respondendo com voz 
RemoteInput remoteInput = 
new RemoteInput.Builder(DetalheActivity.EXTRA_RESPOSTA_VOZ) 
.setLabel("Diga a resposta") 
.build(); 
! 
NotificationCompat.Action action = 
new NotificationCompat.Action.Builder( 
R.drawable.ic_responder, "Responder", pit) 
.addRemoteInput(remoteInput) 
.build(); 
! 
NotificationCompat.WearableExtender wearableExtender = 
new NotificationCompat.WearableExtender() 
.addAction(action); 
! 
Notification notification = new NotificationCompat.Builder(this) 
// demais chamadas da notificação simples 
.extend(wearableExtender) 
.build();
Respondendo com voz 
Bundle remoteInput = 
remoteInput.getResultsFromIntent(getIntent()); 
! 
String voz = 
remoteInput.getCharSequence(EXTRA_RESPOSTA_VOZ).toString();
Comandos de voz 
Call a car/taxi Take a note 
Set alarm Set timer 
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
MinhaApp
WatchViewStub 
BoxInsetLayout 
WearableListView 
CircledImageView 
GridViewPager 
GridPagerAdapter 
FragmentGridPagerAdapter 
CardFragment 
ConfirmationActivity 
DismissOverlayView 
Componentes 
android.support.wearable.view.
<android.support.wearable.view.WatchViewStub 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
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" 
tools:context=".MainWearActivity" 
tools:deviceIds="wear"> 
</android.support.wearable.view.WatchViewStub> 
res/layout/rect_activity_main_wear.xml 
res/layout/round_activity_main_wear.xml
WearableListView 
WearableListView 
WearableListView.Item 
WearableListView.ClickListener 
RecyclerView.Adapter 
CircledImageView
GridViewPager 
GridViewPager 
GridPagerAdapter 
FragmentGridPagerAdapter 
CardFragment 
CardFrame
ConfirmationActivity 
<activity android:name= 
"android.support.wearable.activity.ConfirmationActivity"/> 
Intent it = new Intent(context, ConfirmationActivity.class); 
it.putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, 
ConfirmationActivity.OPEN_ON_PHONE_ANIMATION); 
startActivity(it);
DismissOverlayView 
<style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> 
<item name="android:windowSwipeToDismiss">false</item> 
</style> 
<android.support.wearable.view.DismissOverlayView 
android:id="@+id/dismiss" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/>
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 
compile 'com.google.android.gms:play-services:5.0.89' 
<meta-data 
android:name="com.google.android.gms.version" 
android:value="@integer/google_play_services_version" /> 
GoogleApiClient googleApiClient = 
new GoogleApiClient.Builder(context) 
.addApi(Wearable.API) 
.addConnectionCallbacks(cc) 
.addOnConnectionFailedListener(cfl) 
.build();
Node API 
Message API 
Data 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
Message API 
Wearable.MessageApi.sendMessage(mGoogleApiClient, 
node.getId(), "/navegacao", new byte[]{ 1, 2, 3 } ); 
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(); 
} 
});
Data API 
PutDataMapRequest putDataMapRequest = 
PutDataMapRequest.create("/dados"); 
DataMap dataMap = putDataMapRequest.getDataMap(); 
dataMap.putInt("numero", 1); 
dataMap.putString("nome", "Glauber"); 
! 
Wearable.DataApi.putDataItem( 
mGoogleApiClient, 
putDataMapRequest.asPutDataRequest());
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="ngvl.android.devfest.MeuService"> 
<intent-filter> 
<action 
android:name="com.google.android.gms.wearable.BIND_LISTENER" 
/> 
</intent-filter> 
</service>
Dúvidas?
Nelson Glauber 
@nglauber 
+NelsonGlauber 
nglauber.blogspot.com

Weitere ähnliche Inhalte

Was ist angesagt?

Titanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party RecifeTitanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party Recife
Eric Cavalcanti
 

Was ist angesagt? (13)

Android Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcpsAndroid Wear - Workshop por @cesarnogcps
Android Wear - Workshop por @cesarnogcps
 
Android Libs - AndroidDevConf
Android Libs - AndroidDevConfAndroid Libs - AndroidDevConf
Android Libs - AndroidDevConf
 
Palestra android
Palestra androidPalestra android
Palestra android
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
 
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhoneEntenda porque seu aplicativo de Android não deve ser igual ao de iPhone
Entenda porque seu aplicativo de Android não deve ser igual ao de iPhone
 
Introdução ao Titanium Mobile
Introdução ao Titanium MobileIntrodução ao Titanium Mobile
Introdução ao Titanium Mobile
 
SESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao AndroidSESTINFO 2011 Apresentacao Android
SESTINFO 2011 Apresentacao Android
 
Aplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek NightAplicações móveis multi-plataforma com Titanium - Geek Night
Aplicações móveis multi-plataforma com Titanium - Geek Night
 
Programação Android - Básico
Programação Android - BásicoProgramação Android - Básico
Programação Android - Básico
 
Desenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para AndroidDesenvolvendo aplicações Adobe AIR para Android
Desenvolvendo aplicações Adobe AIR para Android
 
Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2Titanium Mobile - Campus Party Recife 2
Titanium Mobile - Campus Party Recife 2
 
Desenvolvimento Android, por onde começar?
Desenvolvimento Android, por onde começar?Desenvolvimento Android, por onde começar?
Desenvolvimento Android, por onde começar?
 
Titanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party RecifeTitanium Mobile apresentado na Campus Party Recife
Titanium Mobile apresentado na Campus Party Recife
 

Andere mochten auch

Android Wear Development
Android Wear DevelopmentAndroid Wear Development
Android Wear Development
Johnny Sung
 

Andere mochten auch (14)

Android Wear
Android WearAndroid Wear
Android Wear
 
Android wear
Android wearAndroid wear
Android wear
 
Android Wear Presentation
Android Wear PresentationAndroid Wear Presentation
Android Wear Presentation
 
Android Wear Development
Android Wear DevelopmentAndroid Wear Development
Android Wear Development
 
Andriod Lollipop 5.0
Andriod Lollipop 5.0Andriod Lollipop 5.0
Andriod Lollipop 5.0
 
Android wear
Android wearAndroid wear
Android wear
 
Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.Android e iOS: Por que eles são diferentes... ou não.
Android e iOS: Por que eles são diferentes... ou não.
 
Aumentando a produtividade com Android Libs
Aumentando a produtividade com Android LibsAumentando a produtividade com Android Libs
Aumentando a produtividade com Android Libs
 
Seminar report on Android wear
Seminar report on Android wearSeminar report on Android wear
Seminar report on Android wear
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 
Android Wear Presentation
Android Wear PresentationAndroid Wear Presentation
Android Wear Presentation
 
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
Campus Party Recife - Sua primeira e próximas aplicações Android: como fazer ...
 
Interfaces Inteligentes para Android
Interfaces Inteligentes para AndroidInterfaces Inteligentes para Android
Interfaces Inteligentes para Android
 
Dominando o Data Binding no Android
Dominando o Data Binding no AndroidDominando o Data Binding no Android
Dominando o Data Binding no Android
 

Ähnlich wie Android Wear

Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TV
Aécio Costa
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
elliando dias
 
Android Palestra
Android PalestraAndroid Palestra
Android Palestra
Renato
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuração
Jaguaraci Silva
 

Ähnlich wie Android Wear (20)

Android Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu AndroidAndroid Wear: Expandindo as funcionalidades do seu Android
Android Wear: Expandindo as funcionalidades do seu Android
 
Android wear
Android wearAndroid wear
Android wear
 
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
Computação ubíqua, o que isso tem a ver Android Wear? - LinguÁgil 2016
 
Introdução ao Google TV
Introdução ao Google TVIntrodução ao Google TV
Introdução ao Google TV
 
Aplicações Móveis com J2ME
Aplicações Móveis com J2MEAplicações Móveis com J2ME
Aplicações Móveis com J2ME
 
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
Desenvolvimento Mobile com Visual Studio 2008, por onde começar?
 
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma práticaAprenda a usar os recursos “câmera” do android, criando um app de forma prática
Aprenda a usar os recursos “câmera” do android, criando um app de forma prática
 
Curso de Introdução ao Android Básico
Curso de Introdução ao Android BásicoCurso de Introdução ao Android Básico
Curso de Introdução ao Android Básico
 
Android Palestra
Android PalestraAndroid Palestra
Android Palestra
 
google maps api - v1
 google maps api - v1 google maps api - v1
google maps api - v1
 
Internet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine LearningInternet das Coisas com Android things e Machine Learning
Internet das Coisas com Android things e Machine Learning
 
Web Rangers e Power APIs
Web Rangers e Power APIsWeb Rangers e Power APIs
Web Rangers e Power APIs
 
Utiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuraçãoUtiizando o Celular no Apoio à Gerência de configuração
Utiizando o Celular no Apoio à Gerência de configuração
 
Android
AndroidAndroid
Android
 
Dê seus primeiros passos no desenvolvimento com Android
Dê seus primeiros passos no desenvolvimento com AndroidDê seus primeiros passos no desenvolvimento com Android
Dê seus primeiros passos no desenvolvimento com Android
 
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
Desenvolvimento de Aplicações para o Google App Engine (CPBR5)
 
Desenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App EngineDesenvolvimento de aplicações para o Google App Engine
Desenvolvimento de aplicações para o Google App Engine
 
Introdução ao Android (minicurso 4h)
Introdução ao Android (minicurso 4h)Introdução ao Android (minicurso 4h)
Introdução ao Android (minicurso 4h)
 
Aula 05/06 (Service)
Aula 05/06 (Service)Aula 05/06 (Service)
Aula 05/06 (Service)
 
Material Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu AppMaterial Design - Melhorando a experiência de seu App
Material Design - Melhorando a experiência de seu App
 

Mehr von Nelson Glauber Leal

Mehr von Nelson Glauber Leal (20)

Seu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose MultiplatformSeu primeiro app Android e iOS com Compose Multiplatform
Seu primeiro app Android e iOS com Compose Multiplatform
 
Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023Desenvolvimento Moderno de Aplicações Android 2023
Desenvolvimento Moderno de Aplicações Android 2023
 
Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023Novidades incríveis do Android em 2023
Novidades incríveis do Android em 2023
 
Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)Novidades das Bibliotecas Jetpack do Android (2021)
Novidades das Bibliotecas Jetpack do Android (2021)
 
Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021Android Jetpack Compose - Turkey 2021
Android Jetpack Compose - Turkey 2021
 
Jetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on AndroidJetpack Compose a new way to implement UI on Android
Jetpack Compose a new way to implement UI on Android
 
Jetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no AndroidJetpack Compose a nova forma de implementar UI no Android
Jetpack Compose a nova forma de implementar UI no Android
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
Aplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & JetpackAplicações assíncronas no Android com
Coroutines & Jetpack
Aplicações assíncronas no Android com
Coroutines & Jetpack
 
O que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor AndroidO que é preciso para ser um desenvolvedor Android
O que é preciso para ser um desenvolvedor Android
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Arquitetando seu app Android com Jetpack
Arquitetando seu app Android com JetpackArquitetando seu app Android com Jetpack
Arquitetando seu app Android com Jetpack
 
Aplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e JetpackAplicações Assíncronas no Android com Coroutines e Jetpack
Aplicações Assíncronas no Android com Coroutines e Jetpack
 
Mastering Kotlin Standard Library
Mastering Kotlin Standard LibraryMastering Kotlin Standard Library
Mastering Kotlin Standard Library
 
Aplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & JetpackAplicações assíncronas no Android com Coroutines & Jetpack
Aplicações assíncronas no Android com Coroutines & Jetpack
 
Introdução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com KotlinIntrodução ao Desenvolvimento Android com Kotlin
Introdução ao Desenvolvimento Android com Kotlin
 
Persisting Data on SQLite using Room
Persisting Data on SQLite using RoomPersisting Data on SQLite using Room
Persisting Data on SQLite using Room
 
Arquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com JetpackArquitetando seu aplicativo Android com Jetpack
Arquitetando seu aplicativo Android com Jetpack
 
Desenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos AndroidDesenvolvimento Moderno de Aplicativos Android
Desenvolvimento Moderno de Aplicativos Android
 
Desenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos AndroidDesenvolvimento Moderno de aplicativos Android
Desenvolvimento Moderno de aplicativos Android
 

Android Wear

  • 1. Ok Google, o que é ? +Nelson Glauber @nglauber nglauber.blogspot.com
  • 2. Android Wear estende a plataforma Android para uma nova geração de dispositivos, com uma usabilidade desenhada especificamente para os wearables.
  • 3. Serve para que? Vida real Pega o telefone Devagando no telefone 125 vezes ao dia em média!!! Mais tempo para interagir com as pessoas à sua volta
  • 4. UI baseada em um stream de cards
  • 8. Não interrompa o usuário Grandes áreas de toque Micro-interações
  • 10. O que precisamos? Android Studio 0.8 Google Play Services Android Wear Device
  • 11. LG G Watch 280x280, 512MB, 4GB, 400mAh Qualcomm Snapdragon 400 - 1.2Ghz Acelerômetro, Gyro, Compass Samsung Gear Live 320x320, 512MB, 4GB, 300mAh Qualcom Snapdragon 400 - 1.2Ghz Acelerômetro, Gyro, Compass e Heart
  • 12. Motorola Moto 360 320x290, 512MB, 4GB, 320mAh TI OMAP 3 - 1.2Ghz Pedometer e Heart LG G Watch R 320x320, 512MB, 4GB, 410mAh Qualcomm Snapdragon - 1.2Ghz Acelerometer, Gyro, Compass, Barometer e Heart
  • 13. adb -d forward tcp:5601 tcp:5601
  • 15. Notificações Sincronizadas Comandos de Voz Aplicações Wear Envio e sincronização de dados APIs
  • 16. Notificações Sincronizadas Comandos de Voz Aplicações Wear Envio e sincronização de dados APIs
  • 17. Notificações Imagem de Background Ícone da aplicação Título Texto
  • 19. Notificações simples PendingIntent pit = PendingIntent.getActivity( this, 0, new Intent(this, MainMobileActivity.class), 0); ! Notification notification = new NotificationCompat.Builder(this) .setDefaults(Notification.DEFAULT_ALL) .setContentTitle("Notificação Simples") .setContentText("Texto da notificação") .setSmallIcon(R.drawable.ic_notificacao) .setLargeIcon(largeIcon) .setContentIntent(pit) .setAutoCancel(true) .build(); NotificationManagerCompat.from(this).notify(1000, notification);
  • 21. Notificações com ação Intent itAgenda = new Intent(Intent.ACTION_VIEW); itAgenda.setData( Uri.parse("content://com.android.calendar/time")); PendingIntent pitAcao = PendingIntent.getActivity(this, 0, itAgenda, 0); ! Notification notification = new NotificationCompat.Builder(this) // demais chamadas da notificação simples .addAction( new NotificationCompat.Action( R.drawable.ic_agenda, "Agenda", pitAcao)) .build();
  • 23. Notificações em pilha static int idNotificacao = 0; ! Notification notification = new NotificationCompat.Builder(this) // demais chamadas da notificação simples .setContentTitle("Notificação Simples "+ ++idNotificacao) .setGroup("meuGrupo") .build();
  • 24. NotificationCompat.WearableExtender extensionWear = new NotificationCompat.WearableExtender() .setBackground(largeIcon); ! NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle() .setBigContentTitle("Notificação em Pilha") .addLine("Várias mensagens não lidas") .setSummaryText("Resumo"); ! Notification notificationSummary = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_notificacao) .setStyle(inboxStyle) .extend(extensionWear) .setGroup("meuGrupo") .setGroupSummary(true) .build(); ! NotificationManagerCompat nm = NotificationManagerCompat.from(this); ! nm.notify(idNotificacao, notification); nm.notify(1000, notificationSummary);
  • 26. NotificationCompat.Builder notificationPage1 = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_notificacao) .setContentTitle("Primeira Página") .setContentText("Essa é a primeira página") .setLargeIcon(largeIcon) .setAutoCancel(true) .setContentIntent(pit) .setDefaults(NotificationCompat.DEFAULT_ALL); ! Notification notificationPage2 = new NotificationCompat.Builder(this) .setStyle(new NotificationCompat.BigTextStyle() .setBigContentTitle("Segunda página") .bigText("Essa é a segunda página")) .build(); ! Notification notificationWithTwoPages = new NotificationCompat.WearableExtender() .addPage(notificationPage2) .extend(notificationPage1) .build(); ! NotificationManagerCompat nm = NotificationManagerCompat.from(this); nm.notify(1000, notificationWithTwoPages);
  • 27. Notificações Sincronizadas Comandos de Voz Aplicações Wear Envio e sincronização de dados APIs
  • 29. Respondendo com voz RemoteInput remoteInput = new RemoteInput.Builder(DetalheActivity.EXTRA_RESPOSTA_VOZ) .setLabel("Diga a resposta") .build(); ! NotificationCompat.Action action = new NotificationCompat.Action.Builder( R.drawable.ic_responder, "Responder", pit) .addRemoteInput(remoteInput) .build(); ! NotificationCompat.WearableExtender wearableExtender = new NotificationCompat.WearableExtender() .addAction(action); ! Notification notification = new NotificationCompat.Builder(this) // demais chamadas da notificação simples .extend(wearableExtender) .build();
  • 30. Respondendo com voz Bundle remoteInput = remoteInput.getResultsFromIntent(getIntent()); ! String voz = remoteInput.getCharSequence(EXTRA_RESPOSTA_VOZ).toString();
  • 31. Comandos de voz Call a car/taxi Take a note Set alarm Set timer 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
  • 32. Notificações Sincronizadas Comandos de Voz Aplicações Wear Envio e sincronização de dados APIs
  • 33. Aplicações Wear MinhaApp MobileAPK WearAPK
  • 35. WatchViewStub BoxInsetLayout WearableListView CircledImageView GridViewPager GridPagerAdapter FragmentGridPagerAdapter CardFragment ConfirmationActivity DismissOverlayView Componentes android.support.wearable.view.
  • 36. <android.support.wearable.view.WatchViewStub xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" 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" tools:context=".MainWearActivity" tools:deviceIds="wear"> </android.support.wearable.view.WatchViewStub> res/layout/rect_activity_main_wear.xml res/layout/round_activity_main_wear.xml
  • 37. WearableListView WearableListView WearableListView.Item WearableListView.ClickListener RecyclerView.Adapter CircledImageView
  • 38. GridViewPager GridViewPager GridPagerAdapter FragmentGridPagerAdapter CardFragment CardFrame
  • 39. ConfirmationActivity <activity android:name= "android.support.wearable.activity.ConfirmationActivity"/> Intent it = new Intent(context, ConfirmationActivity.class); it.putExtra(ConfirmationActivity.EXTRA_ANIMATION_TYPE, ConfirmationActivity.OPEN_ON_PHONE_ANIMATION); startActivity(it);
  • 40. DismissOverlayView <style name="AppTheme" parent="@android:style/Theme.DeviceDefault"> <item name="android:windowSwipeToDismiss">false</item> </style> <android.support.wearable.view.DismissOverlayView android:id="@+id/dismiss" android:layout_width="match_parent" android:layout_height="match_parent"/>
  • 41. Notificações Sincronizadas Comandos de Voz Aplicações Wear Envio e sincronização de dados APIs
  • 43. Google Play Services compile 'com.google.android.gms:play-services:5.0.89' <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context) .addApi(Wearable.API) .addConnectionCallbacks(cc) .addOnConnectionFailedListener(cfl) .build();
  • 44. Node API Message API Data API
  • 45. 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
  • 46. Message API Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), "/navegacao", new byte[]{ 1, 2, 3 } ); 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(); } });
  • 47. Data API PutDataMapRequest putDataMapRequest = PutDataMapRequest.create("/dados"); DataMap dataMap = putDataMapRequest.getDataMap(); dataMap.putInt("numero", 1); dataMap.putString("nome", "Glauber"); ! Wearable.DataApi.putDataItem( mGoogleApiClient, putDataMapRequest.asPutDataRequest());
  • 48. 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
  • 49. WearableListenerService extends Service implements NodeApi.NodeListener, MessageApi.MessageListener, DataApi.DataListener Node API Message API Data API <service android:name="ngvl.android.devfest.MeuService"> <intent-filter> <action android:name="com.google.android.gms.wearable.BIND_LISTENER" /> </intent-filter> </service>
  • 50.
  • 52. Nelson Glauber @nglauber +NelsonGlauber nglauber.blogspot.com