Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Construindo Aplicações Android com Firebase

Construindo Aplicações Android com Firebase

Talk apresentada no DevFest Nordeste 2016.

Felipe Arimateia

October 21, 2016
Tweet

More Decks by Felipe Arimateia

Other Decks in Technology

Transcript

  1. Felipe Arimatéia (Ari) Mobile Developer desde de 2010, apaixonado por

    código e viciado em séries. @twiterdoari +FelipeArimateia felipearimateia
  2. Firebase É uma plataforma mobile para auxiliar no desenvolvimento de

    aplicativos, sem precisar investir em uma estrutura complexa.
  3. Criando Projeto • Criar um projeto no Firebase Console •

    Adicionar um Android App • Faça o download do google-services.json • E copie para o diretório do módulo, normalmente é app/
  4. Adicionar SDK No build.gradle do diretório raiz adicionar o plugin

    do google-services buildscript { // ... dependencies { // ... classpath 'com.google.gms:google-services:3.0.0' } }
  5. Adicionar SDK • Adicionar o plugin e dependências no build.gradle

    • Para iniciar é recomendado adicionar o firebase-core • O core já inclui o serviço de Analytics. dependencies { // ... compile 'com.google.firebase:firebase-core:9.6.1' } // ADD THIS AT THE BOTTOM apply plugin: 'com.google.gms.google-services'
  6. O Analytics é o coração das aplicações de sucesso, através

    dele é possível conhecer e engajar os usuários.
  7. Enviando eventos private FirebaseAnalytics mFirebaseAnalytics; // Obtain the FirebaseAnalytics instance.

    mFirebaseAnalytics = FirebaseAnalytics.getInstance(this); Bundle bundle = new Bundle(); bundle.putString(FirebaseAnalytics.Param.ITEM_ID, id); bundle.putString(FirebaseAnalytics.Param.ITEM_NAME, name); bundle.putString(FirebaseAnalytics.Param.CONTENT_TYPE, "image"); mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SELECT_CONTENT, bundle);
  8. O Firebase Authentication oferece os seguintes serviços de autenticação: •

    Autenticação via e-mail e senha. • Redes Sociais: Google, Facebook, Twitter e Github. • Autenticação Anônima.
  9. Criando uma conta mAuth.createUserWithEmailAndPassword(email, password) .addOnCompleteListener( task -> { Log.d(TAG,

    "createUserWithEmail:onComplete:" + task.isSuccessful()); if (!task.isSuccessful()) { Toast.makeText(EmailPasswordActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... });
  10. Logando usuário mAuth.signInWithEmailAndPassword(email, password) .addOnCompleteListener(task -> { Log.d(TAG, "signInWithEmail:onComplete:" +

    task.isSuccessful()); if (!task.isSuccessful()) { Log.w(TAG, "signInWithEmail", task.getException()); Toast.makeText(EmailPasswordActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } // ... });
  11. AuthStateListener mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull

    FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // User is signed in Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); } else { // User is signed out Log.d(TAG, "onAuthStateChanged:signed_out"); } // ... } };
  12. Firebase Realtime Database é um banco de dados NoSQL, que

    sincroniza todos os clientes conectados em tempo real. • Tempo real • Off-line • Acesso direto via SDK Dependência: compile 'com.google.firebase:firebase-database:9.6.1'
  13. Estrutura { "users": { "alovelace": { "name": "Ada Lovelace", "contacts":

    { "ghopper": true }, }, "ghopper": { ... }, "eclarke": { ... } } }
  14. Tipo de dados • String • Long • Double •

    Boolean • Map <String, Object> • List<Object>
  15. Salvando dados @IgnoreExtraProperties public class User { public String username;

    public String email; public User() { // Default constructor required for calls to DataSnapshot.getValue(User.class) } } private void writeNewUser(String userId, String name, String email) { User user = new User(name, email); mDatabase.child("users").child(userId).setValue(user); }
  16. Escutando Dados ValueEventListener postListener = new ValueEventListener() { @Override public

    void onDataChange(DataSnapshot dataSnapshot) { // Get Post object and use the values to update the UI Post post = dataSnapshot.getValue(Post.class); // ... } @Override public void onCancelled(DatabaseError databaseError) { // Getting Post failed, log a message Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); // ... } }; mPostReference.addValueEventListener(postListener);
  17. Ler dado uma vez final String userId = getUid(); mDatabase.child("users").child(userId).addListenerForSingleValueEvent(

    new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Get user value User user = dataSnapshot.getValue(User.class); // ... } @Override public void onCancelled(DatabaseError databaseError) { Log.w(TAG, "getUser:onCancelled", databaseError.toException()); } });
  18. Firebase Storage proporciona o uploads e downloads de arquivos. •

    Robusto • Seguro • Escalável Dependências: compile 'com.google.firebase:firebase-storage:9.6.1' compile 'com.google.firebase:firebase-auth:9.6.1'
  19. Criando referência1 FirebaseStorage storage = FirebaseStorage.getInstance(); // Create a storage

    reference from our app StorageReference storageRef = storage.getReferenceFromUrl("gs://<your-bucket-name>"); // Create a reference to "mountains.jpg" StorageReference mountainsRef = storageRef.child("mountains.jpg"); // Create a reference to 'images/mountains.jpg' StorageReference mountainImagesRef = storageRef.child("images/mountains.jpg"); 1 A URL pode ser obtida na seção Storage do Firebase console
  20. Upload O Firebase permite fazer o upload de stream, dados

    que estão na memória e arquivos locais. Uri file = Uri.fromFile(new File("path/to/images/rivers.jpg")); StorageReference riversRef = storageRef.child("images/"+file.getLastPathSegment()); uploadTask = riversRef.putFile(file); // Register observers to listen for when the download is done or if it fails uploadTask.addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle unsuccessful uploads } }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { @Override public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { // taskSnapshot.getMetadata() contains file metadata such as size, content-type, and download URL. Uri downloadUrl = taskSnapshot.getDownloadUrl(); } });
  21. Download O Firebase permite fazer o download para memória ou

    em um arquivo local. E ele também gera uma URL para compartilhamento. StorageReference islandRef = storageRef.child("images/island.jpg"); File localFile = File.createTempFile("images", "jpg"); islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() { @Override public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { String url = taskSnapshot.getDownloadUrl(); } }).addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception exception) { // Handle any errors } });
  22. Firebase Cloud Messaging (FCM) permite a troca de mensagens e

    notificações entre plataformas diferentes. • Direcionamento versátil de mensagens • Suporte a mensagens de dados e notificações • Mensagens ascendentes de aplicativos cliente Dependência: compile 'com.google.firebase:firebase-messaging:9.6.1'
  23. Configuração É possível gerenciar a criação e atualização de tokens

    criando um serviço que extenda de FirebaseInstanceIdService. E para processar as mensagens enviadas pelo FCM, é preciso criar um serviço que extenda de FirebaseMessagingService.
  24. Manifest <service android:name=".MyFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> ... <service

    android:name=".MyFirebaseInstanceIDService"> <intent-filter> <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/> </intent-filter> </service>
  25. Obtendo token @Override public void onTokenRefresh() { // Get updated

    InstanceID token. String refreshedToken = FirebaseInstanceId.getInstance().getToken(); Log.d(TAG, "Refreshed token: " + refreshedToken); // TODO: Implement this method to send any registration to your app's servers. sendRegistrationToServer(refreshedToken); }
  26. Processando mensagem @Override public void onMessageReceived(RemoteMessage remoteMessage) { // TODO(developer):

    Handle FCM messages here. // Not getting messages here? See why this may be: https://goo.gl/39bRNJ Log.d(TAG, "From: " + remoteMessage.getFrom()); // Check if message contains a data payload. if (remoteMessage.getData().size() > 0) { Log.d(TAG, "Message data payload: " + remoteMessage.getData()); } // Check if message contains a notification payload. if (remoteMessage.getNotification() != null) { Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody()); } // Also if you intend on generating your own notifications as a result of a received FCM // message, here is where that should be initiated. See sendNotification method below. }
  27. O Firebase Crash Reporting cria relatórios de erro detalhados, ainda

    é um serviço beta. • Monitore erros fatais e não fatais • Colete os dados necessários para diagnosticar problemas • Integre ao Analytics Dependência: compile 'com.google.firebase:firebase-crash:9.6.1'
  28. Remote Config O Firebase Remote Config é um serviço de

    nuvem que permite alterar o comportamento e a aparência do aplicativo sem exigir que os usuários baixem uma nova atualização. • Disponibilizar rapidamente alterações para a base de usuários do aplicativo • Personalizar o aplicativo para segmentos da base de usuários • Executar testes A/B para aprimorar o aplicativo Dependência: compile 'com.google.firebase:firebase-config:9.6.1'
  29. Configuração FirebaseRemoteConfig firebaseRemoteConfig = FirebaseRemoteConfig.getInstance(); FirebaseRemoteConfigSettings configSettings = new FirebaseRemoteConfigSettings.Builder()

    .setDeveloperModeEnabled(BuildConfig.DEBUG) .build(); firebaseRemoteConfig.setConfigSettings(configSettings); firebaseRemoteConfig.setDefaults(R.xml.remote_config_defaults);