+Nelson Glauber
@nglauber
www.nglauber.com.br
Google Play Services!
ROCKS!!!
@nglauber
+NelsonGlauber
www.nglauber.com.br
Visão geral
• Com o Google Play Services, sua app pode utilizar os
serviços do Google como Mapas, Google+, Drive, e
muito mais.
• Tudo isso com atualização automática via Google Play
por meio de um simples APK. (5 versões só em 2015)
• Isso torna mais ágil para os usuários receberem
atualizações de serviços do Google e fácil para o
desenvolvedor em integra-las ao seu app!
• Tudo isso compatível com Android 2.3 (API Level 9) ou
superior.
BUILD
+MagnusHyttsen
BETTER
APPS!!!
Google Play Services allows you to…
Arquitetura
Setup
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.google.gms:google-services:1.4.0-beta3'
}
}
Setup
apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
...
dependencies {
compile 'com.google.android.gms:play-<API>:8.1.+'
}
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
https://developers.google.com/mobile/add?platform=android
Áreas
✓ Desenvolvimento
- Usando as APIs disponíveis
✓ Engajamento
- Mais de um 1 Bilhão de aparelhos
✓ Rentabilidade
- Em 2015, mais de 7 Bilhões de dólares pagos aos
desenvolvedores.
Desenvolvimento
Analytics
Analytics
compile 'com.google.android.gms:play-services-analytics:8.1.0'
GoogleAnalytics analytics = GoogleAnalytics.getInstance(this);
Tracker mTracker = analytics.newTracker(R.xml.global_tracker);
mTracker.send(new HitBuilders.EventBuilder()
.setCategory("Ação")
.setAction("Compartilhar")
.build());
mTracker.setScreenName("TelaPrincipal");
mTracker.send(new HitBuilders.ScreenViewBuilder().build());
Login e senha pls!
Google Sign in
Google Sign in
compile 'com.google.android.gms:play-services-plus:8.1.0'
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(Plus.API)
.addScope(new Scope(Scopes.PROFILE))
.addScope(new Scope(Scopes.EMAIL))
.build();
mGoogleApiClient.connect();
Mapas e Localização
• Diferentes visualizações
• Marcadores customizados
• Polylines + Directions
• Geofencing
• Fused Location
Places
Place Picker Add places / photos Place autocomplete
Current Place
Places
GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Places.GEO_DATA_API)
.addApi(Places.PLACE_DETECTION_API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
compile "com.google.android.gms:play-services-location:8.1.0"
Places
PendingResult<PlaceLikelihoodBuffer> result =
Places.PlaceDetectionApi.getCurrentPlace(mGoogleApiClient, null);
result.setResultCallback(new ResultCallback<PlaceLikelihoodBuffer>() {
@Override
public void onResult(PlaceLikelihoodBuffer likelyPlaces) {
for (PlaceLikelihood placeLikelihood : likelyPlaces) {
Log.i(TAG, String.format("Place '%s' has likelihood: %g",
placeLikelihood.getPlace().getName(),
placeLikelihood.getLikelihood()));
}
likelyPlaces.release();
}
});
Places
PlacePicker.IntentBuilder intentBuilder = new PlacePicker.IntentBuilder();
Intent intent = intentBuilder.build(getActivity());
startActivityForResult(intent, REQUEST_PLACE_PICKER);
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_PLACE_PICKER &&
resultCode == Activity.RESULT_OK) {
final Place place = PlacePicker.getPlace(data, getActivity());
final CharSequence name = place.getName();
final CharSequence address = place.getAddress();
final CharSequence phone = place.getPhoneNumber();
final String placeId = place.getId();
...
Engajamento
Google Cloud Messaging
Google Cloud Messaging
1. registrar
2. enviar chave
para o servidor
a. envia uma
mensagem
b. mensagem

entregue
App Indexing & Deep Linking
App Install Ads
• Estratégia do AdWords para
divulgar seu aplicativo.
• Dentro de outros aplicativos
• Resultado de buscas
• Vídeo no YouTube
App Invites
private void onInviteClicked() {
Intent intent = new AppInviteInvitation.IntentBuilder("Título")
.setMessage("Mensagem")
.setDeepLink(Uri.parse(getString(R.string.invitation_deep_link)))
.setCustomImage(Uri.parse("http://example.com/imagem.jpg"))
.setCallToActionText("Install!!!")
.build();
startActivityForResult(intent, REQUEST_INVITE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_INVITE) {
if (resultCode == RESULT_OK) {
String[] ids = AppInviteInvitation.getInvitationIds(resultCode, data);
...
}
}
}
Rentabilidade
AdMob
<com.google.android.gms.ads.AdView
android:id="@+id/adView"
…
ads:adSize="BANNER"
ads:adUnitId="@string/test_banner_ad_unit_id"/>
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);
compile 'com.google.android.gms:play-services-ads:8.1.0'
AdMob
InterstitialAd mInterstitialAd =
new InterstitialAd(this);
mInterstitialAd.setAdUnitId(
getString(R.string.test_interstitial_ad_unit_id));
AdRequest adRequest = new AdRequest.Builder().build();
mInterstitialAd.loadAd(adRequest);
if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
In-App Billing
• Venda de produtos (não físicos)
• Administração de produtos
• Assinaturas
• 70% do valor vendido é seu!
Android pay
Acabou???
Mobile Vision
Mobile Vision
• getIsLeftEyeOpenProbability()

getIsRighteyeOpenProbability()

Retorna um valor entre 0 e 1 dando a
probabilidade de olho esquerdo estar
aberto.
• getIsSmilingProbability()

Retorna um valor entre 0 e 1 com a
probabilidade de estar sorrindo.
Mobile Vision
FaceDetector faceDetector =
new FaceDetector.Builder(getApplicationContext())
.setTrackingEnabled(false)
.build();
if(faceDetector.isOperational()){
Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Face> faces = faceDetector.detect(frame);
for(int i=0; i<faces.size(); i++) {
Face thisFace = faces.valueAt(i);
float x1 = thisFace.getPosition().x;
float y1 = thisFace.getPosition().y;
float x2 = x1 + thisFace.getWidth();
float y2 = y1 + thisFace.getHeight();
tempCanvas.drawRoundRect(
new RectF(x1, y1, x2, y2), 2, 2, myRectPaint);
}
}
Nearby API
Nearby API
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Nearby.MESSAGES_API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
// Publish bytes to send
message = new Message(yourByteArray);
Nearby.Messages.publish(mGoogleApiClient, message)
.setResultCallback(new ErrorCheckingCallback("publish()"));
Nearby API
// Create an instance of MessageListener
messageListener = new MessageListener() {
@Override
public void onFound(final Message message) {
// Do something with message.getContent()
}
};
// Subscribe to receive messages
Nearby.Messages.subscribe(mGoogleApiClient, messageListener)
.setResultCallback(new ErrorCheckingCallback("subscribe()"));
Nearby API
Android Wear
Node API
Message API
Data API
Channel API
Fit
Drive
https://developers.google.com/android/
Dúvidas?
@nglauber
+NelsonGlauber
www.nglauber.com.br
Obrigado!

Google Play Services Rocks!!!