Android + Firebase
Ana Coimbra
Gomes
Android & Web Dev
@anacoimbrag
ana.coimbra.gomes@gmail.com
(31) 9 9248-2436
Firebase?
Libs: Hate & Love
Play Store: https://goo.gl/qZCR5r
Github: https://github.com/anacoimbrag/Android-Firebase
Tudo pronto?
Vamos lá!
Configuração Inicial
Configuração Inicial
Configuração Inicial
Configuração Inicial
Em <project>/build.gradle, adicionar:
buildscript {
dependencies {
classpath 'com.google.gms:google-services:3.1.0’
}
}
Em <project>/<app-module>/build.gradle, adicionar, no final do arquivo:
apply plugin: ‘com.google.gms.google-services’
Em Application.java:
@Override
public void onCreate() {
super.onCreate();
FirebaseApp.initializeApp(this);
}
Configuração Inicial
Autenticação
• Importante saber a identidade do usuário
• Manter segurança
• Recursos:
• Login por e-mail e senha
• Login por redes sociais (Google, Facebook, etc.)
• Login personalizado
• Login anônimo
compile 'com.google.firebase:firebase-auth:10.2.1'
Autenticação - Login
LoginActivity.java
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Open MainActivity
} else {
// Handle Error
}
}
});
private FirebaseAuth auth = FirebaseAuth.getInstance();
Autenticação – Recuperar Senha
RecoverPasswordActivity.java
private FirebaseAuth auth = FirebaseAuth.getInstance();
auth.sendPasswordResetEmail(email)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// Show Dialog
}
});
Autenticação – Registrar Usuário
RegisterUserActivity.java
private FirebaseAuth auth = FirebaseAuth.getInstance();
auth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser firebaseUser = task.getResult().getUser();
uploadPicture(firebaseUser);
} else {
// Handle error
}
}
});
Armazenamento
• Criado para armazenar arquivos gerado pelos usuários
• Upload e download seguros
compile 'com.google.firebase:firebase-storage:10.2.1'
Armazenamento
RegisterUserActivity.java
FirebaseStorage storage = FirebaseStorage. getInstance();
StorageReference imagesRef =
storage.getReference().child( "images");
UploadTask uploadTask =
imagesRef.child(fUser.getUid()).putFile( imgUri);
uploadTask.addOnCompleteListener( new
OnCompleteListener<TaskSnapshot>(){
@Override
public void onComplete(@NonNull Task<TaskSnapshot> task){
if (task.isSuccessful()) {
User user = new User(fUser.getUid(), name, email,
task.getResult().getDownloadUrl().toString(), interests);
// Register user
}
}
});
Banco de dados
• Banco de dados em tempo real disponível e
sincronizado para todos os usuários
• NoSQL, Não relacional, Json
• Características:
○ Tempo real
○ Off-line
○ Acessível em dispositivos clientes
compile 'com.google.firebase:firebase-database:10.2.1'
Banco de dados - Salvar
RegisterUserActivity.java
FirebaseDatabase database = FirebaseDatabase. getInstance();
DatabaseReference userRef = database.getReference( "users");
userRef.child(user.getUid()).setValue(user.toMap());
DatabaseReference libsRef = database.getReference( "libs");
Library library = new Library(name, url, date, sdk, license, description);
libsRef.push().setValue(library)
.addOnCompleteListener( new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()) {
finish();
}
}
});
AddLibActivity.java
Banco de dados - Recuperar
CardsFragment.java
libsRef.addValueEventListener( new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
GenericTypeIndicator<HashMap<String, Library>> t =
new GenericTypeIndicator<HashMap<String, Library>>() {};
libraries = dataSnapshot.getValue(t);
adapter.setData(libraries);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Handle Error
}
});
FirebaseDatabase database = FirebaseDatabase. getInstance();
DatabaseReference libsRef = database.getReference( "libs");
Banco de dados - Alterar
CardsFragment.java
@Override
public void cardSwipedLeft( int position) {
libsRef.child(adapter.getItem(position).getUid())
.child("users")
.child(user.getUid())
.setValue(false);
}
@Override
public void cardSwipedRight( int position) {
libsRef.child(adapter.getItem(position).getUid())
.child("users")
.child(user.getUid())
.setValue(true);
}
FirebaseDatabase database = FirebaseDatabase. getInstance();
DatabaseReference libsRef = database.getReference( "libs");
Analytics
• Medição de aplicativo
• Informações sobre o uso do aplicativo e o envolvimento do usuário
• Recursos:
○ Relatórios ilimitados
○ Segmentação do público-alvo
compile 'com.google.firebase:firebase-core:10.2.1'
Analytics
RegisterUserActivity.java
private FirebaseAnalytics firebaseAnalytics =
FirebaseAnalytics. getInstance(context);
private void registerToAnalytics() {
Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.UserProperty. SIGN_UP_METHOD,
"email and password");
firebaseAnalytics.logEvent(FirebaseAnalytics.Event. SIGN_UP,
bundle);
}
Cloud Messaging
• Enviar mensagens de notificação para promover novas
interações e a retenção de usuários
• É possível enviar dados para segmentos de usuários e
separá-los por plataforma, por canal ou enviar individualmente
• Envio de mensagens pelo console ou por servidor próprio
compile 'com.google.firebase:firebase-messaging:10.2.1'
Cloud Messaging
CustomFirebaseInstanceIdService.java
public class CustomFirebaseInstanceIdService extends FirebaseInstanceIdService {
@Override
public void onTokenRefresh() {
String refreshedToken = FirebaseInstanceId. getInstance().getToken();
// Send token to custom server
}
}
Cloud Messaging
CustomFirebaseMessagingService.java
public class CustomFirebaseMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Intent notificationsIntent = new Intent(this, LoginActivity. class);
PendingIntent intent = PendingIntent. getActivity(this, 0,notificationsIntent,
PendingIntent. FLAG_CANCEL_CURRENT);
NotificationManager notificationManager =(NotificationManager)
getSystemService(Context. NOTIFICATION_SERVICE);
Bitmap icon = BitmapFactory. decodeResource(getResources(), R.drawable. ic_notification);
NotificationCompat.Builder builder = new NotificationCompat.Builder( this)
.setSmallIcon(R.drawable. ic_notification)
.setLargeIcon(icon)
.setContentTitle(remoteMessage.getNotification().getTitle())
.setContentText(remoteMessage.getNotification().getBody())
.setVibrate(new long[]{0, 100, 1000})
.setContentIntent(intent)
.setAutoCancel( true);
notificationManager.notify(( int) new Date().getTime(), builder.build());
}
}
Crash Reporting (Beta)
• Relatórios de erro detalhados no aplicativo
• Agrupados por pilhas semelhantes e agrupados de acordo com
a gravidade sobre o impacto para o usuário
• É possível registrar eventos personalizados para reconhecer as
etapas que podem levar ao erro
compile 'com.google.firebase:firebase-crash:10.2.1'
App.java
FirebaseCrash. report(new Exception("App initialized"));
Crash Reporting (Beta)
AddLibActivity.java
FirebaseCrash. log("User entered wrong date format");
Crash Reporting (Beta)
Test Lab
• Testes do aplicativo em dispositivos hospedados nos
datacenters do Google
• Mostra capturas de tela e vídeo de utilização
• É possível integrar com sistemas de integração contínua
Test Lab
Hmm, Firebase!
https://firebase.google.com/
Thanks!

Android + firebase

  • 1.
  • 2.
    Ana Coimbra Gomes Android &Web Dev @anacoimbrag ana.coimbra.gomes@gmail.com (31) 9 9248-2436
  • 3.
  • 4.
    Libs: Hate &Love Play Store: https://goo.gl/qZCR5r Github: https://github.com/anacoimbrag/Android-Firebase Tudo pronto? Vamos lá!
  • 5.
  • 6.
  • 7.
  • 8.
    Configuração Inicial Em <project>/build.gradle,adicionar: buildscript { dependencies { classpath 'com.google.gms:google-services:3.1.0’ } } Em <project>/<app-module>/build.gradle, adicionar, no final do arquivo: apply plugin: ‘com.google.gms.google-services’ Em Application.java: @Override public void onCreate() { super.onCreate(); FirebaseApp.initializeApp(this); }
  • 9.
  • 10.
    Autenticação • Importante sabera identidade do usuário • Manter segurança • Recursos: • Login por e-mail e senha • Login por redes sociais (Google, Facebook, etc.) • Login personalizado • Login anônimo compile 'com.google.firebase:firebase-auth:10.2.1'
  • 11.
    Autenticação - Login LoginActivity.java auth.signInWithEmailAndPassword(email,password) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // Open MainActivity } else { // Handle Error } } }); private FirebaseAuth auth = FirebaseAuth.getInstance();
  • 12.
    Autenticação – RecuperarSenha RecoverPasswordActivity.java private FirebaseAuth auth = FirebaseAuth.getInstance(); auth.sendPasswordResetEmail(email) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // Show Dialog } });
  • 13.
    Autenticação – RegistrarUsuário RegisterUserActivity.java private FirebaseAuth auth = FirebaseAuth.getInstance(); auth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { FirebaseUser firebaseUser = task.getResult().getUser(); uploadPicture(firebaseUser); } else { // Handle error } } });
  • 14.
    Armazenamento • Criado paraarmazenar arquivos gerado pelos usuários • Upload e download seguros compile 'com.google.firebase:firebase-storage:10.2.1'
  • 15.
    Armazenamento RegisterUserActivity.java FirebaseStorage storage =FirebaseStorage. getInstance(); StorageReference imagesRef = storage.getReference().child( "images"); UploadTask uploadTask = imagesRef.child(fUser.getUid()).putFile( imgUri); uploadTask.addOnCompleteListener( new OnCompleteListener<TaskSnapshot>(){ @Override public void onComplete(@NonNull Task<TaskSnapshot> task){ if (task.isSuccessful()) { User user = new User(fUser.getUid(), name, email, task.getResult().getDownloadUrl().toString(), interests); // Register user } } });
  • 16.
    Banco de dados •Banco de dados em tempo real disponível e sincronizado para todos os usuários • NoSQL, Não relacional, Json • Características: ○ Tempo real ○ Off-line ○ Acessível em dispositivos clientes compile 'com.google.firebase:firebase-database:10.2.1'
  • 17.
    Banco de dados- Salvar RegisterUserActivity.java FirebaseDatabase database = FirebaseDatabase. getInstance(); DatabaseReference userRef = database.getReference( "users"); userRef.child(user.getUid()).setValue(user.toMap()); DatabaseReference libsRef = database.getReference( "libs"); Library library = new Library(name, url, date, sdk, license, description); libsRef.push().setValue(library) .addOnCompleteListener( new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { finish(); } } }); AddLibActivity.java
  • 18.
    Banco de dados- Recuperar CardsFragment.java libsRef.addValueEventListener( new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { GenericTypeIndicator<HashMap<String, Library>> t = new GenericTypeIndicator<HashMap<String, Library>>() {}; libraries = dataSnapshot.getValue(t); adapter.setData(libraries); } @Override public void onCancelled(DatabaseError databaseError) { // Handle Error } }); FirebaseDatabase database = FirebaseDatabase. getInstance(); DatabaseReference libsRef = database.getReference( "libs");
  • 19.
    Banco de dados- Alterar CardsFragment.java @Override public void cardSwipedLeft( int position) { libsRef.child(adapter.getItem(position).getUid()) .child("users") .child(user.getUid()) .setValue(false); } @Override public void cardSwipedRight( int position) { libsRef.child(adapter.getItem(position).getUid()) .child("users") .child(user.getUid()) .setValue(true); } FirebaseDatabase database = FirebaseDatabase. getInstance(); DatabaseReference libsRef = database.getReference( "libs");
  • 20.
    Analytics • Medição deaplicativo • Informações sobre o uso do aplicativo e o envolvimento do usuário • Recursos: ○ Relatórios ilimitados ○ Segmentação do público-alvo compile 'com.google.firebase:firebase-core:10.2.1'
  • 21.
    Analytics RegisterUserActivity.java private FirebaseAnalytics firebaseAnalytics= FirebaseAnalytics. getInstance(context); private void registerToAnalytics() { Bundle bundle = new Bundle(); bundle.putString(FirebaseAnalytics.UserProperty. SIGN_UP_METHOD, "email and password"); firebaseAnalytics.logEvent(FirebaseAnalytics.Event. SIGN_UP, bundle); }
  • 22.
    Cloud Messaging • Enviarmensagens de notificação para promover novas interações e a retenção de usuários • É possível enviar dados para segmentos de usuários e separá-los por plataforma, por canal ou enviar individualmente • Envio de mensagens pelo console ou por servidor próprio compile 'com.google.firebase:firebase-messaging:10.2.1'
  • 23.
    Cloud Messaging CustomFirebaseInstanceIdService.java public classCustomFirebaseInstanceIdService extends FirebaseInstanceIdService { @Override public void onTokenRefresh() { String refreshedToken = FirebaseInstanceId. getInstance().getToken(); // Send token to custom server } }
  • 24.
    Cloud Messaging CustomFirebaseMessagingService.java public classCustomFirebaseMessagingService extends FirebaseMessagingService { @Override public void onMessageReceived(RemoteMessage remoteMessage) { Intent notificationsIntent = new Intent(this, LoginActivity. class); PendingIntent intent = PendingIntent. getActivity(this, 0,notificationsIntent, PendingIntent. FLAG_CANCEL_CURRENT); NotificationManager notificationManager =(NotificationManager) getSystemService(Context. NOTIFICATION_SERVICE); Bitmap icon = BitmapFactory. decodeResource(getResources(), R.drawable. ic_notification); NotificationCompat.Builder builder = new NotificationCompat.Builder( this) .setSmallIcon(R.drawable. ic_notification) .setLargeIcon(icon) .setContentTitle(remoteMessage.getNotification().getTitle()) .setContentText(remoteMessage.getNotification().getBody()) .setVibrate(new long[]{0, 100, 1000}) .setContentIntent(intent) .setAutoCancel( true); notificationManager.notify(( int) new Date().getTime(), builder.build()); } }
  • 25.
    Crash Reporting (Beta) •Relatórios de erro detalhados no aplicativo • Agrupados por pilhas semelhantes e agrupados de acordo com a gravidade sobre o impacto para o usuário • É possível registrar eventos personalizados para reconhecer as etapas que podem levar ao erro compile 'com.google.firebase:firebase-crash:10.2.1'
  • 26.
    App.java FirebaseCrash. report(new Exception("Appinitialized")); Crash Reporting (Beta) AddLibActivity.java FirebaseCrash. log("User entered wrong date format");
  • 27.
  • 28.
    Test Lab • Testesdo aplicativo em dispositivos hospedados nos datacenters do Google • Mostra capturas de tela e vídeo de utilização • É possível integrar com sistemas de integração contínua
  • 29.
  • 30.
  • 31.