Comment créer une application de chat Android à l'aide de Firebase

Ce que vous allez créer

Avec Firebase, la création d'applications sociales en temps réel est une promenade dans le parc. Et la meilleure chose à ce sujet: vous n'avez pas à écrire une seule ligne de code côté serveur.

Dans ce tutoriel, je vais vous montrer comment utiliser l'interface utilisateur de Firebase pour créer un groapplication de chat que vous pouvez partager avec vos amis. Cela va être une application très simple avec un seul salon de discussion, qui est ouvert à tous les utilisateurs.

Comme vous l'aurez deviné, l'application dépendra de Firebase Auth pour gérer l'enregistrement des utilisateurs et la connexion. Elle utilisera également la base de données en temps réel de Firebase pour stocker les messages de discussion en groupe..

Conditions préalables

Pour pouvoir suivre ce didacticiel pas à pas, vous devez disposer des éléments suivants:

  • La dernière version d'Android Studio
  • Un compte Firebase

Pour obtenir des instructions sur la configuration d'un compte Firebase et la préparation au développement de Firebase dans Android Studio, consultez mon tutoriel Prise en main de Firebase pour Android ici sur Envato Tuts.+.

1. Créer un projet Android Studio

Lancez Android Studio et créez un nouveau projet avec une activité vide appelée Activité principale.

Pour que le projet utilise la plate-forme Firebase, ouvrez la fenêtre de Firebase Assistant en cliquant sur Outils> Firebase.

Lorsque vous utilisez la plateforme Firebase, il est généralement judicieux d’ajouter Firebase Analytics au projet. Par conséquent, dans la fenêtre de l’assistant Firebase, accédez à la Analytique section et appuyez sur Enregistrer un événement Analytics.

Ensuite, appuyez sur le Se connecter à Firebase bouton et assurez-vous que le Créer un nouveau projet Firebase l'option est sélectionnée. Une fois la connexion établie, appuyez sur le bouton Ajouter des analyses à votre application bouton.

À ce stade, le projet Android Studio est non seulement intégré à Firebase Analytics, mais il est également prêt à utiliser tous les autres services Firebase..

2. Ajouter des dépendances

Nous utiliserons deux bibliothèques dans ce projet: l'interface utilisateur de Firebase et la bibliothèque de prise en charge de la conception Android. Par conséquent, ouvrez le build.gradle fichier du app module et ajouter ce qui suit compiler dépendances à elle:

compiler 'com.android.support:design:23.4.0' compiler 'com.firebaseui: firebase-ui: 0.6.0'

appuyez sur la Synchroniser maintenant bouton pour mettre à jour le projet.

3. Définir les mises en page

le activity_main.xml fichier, qui est déjà lié à Activité principale, définit le contenu de l'écran d'accueil de l'application. En d'autres termes, il représentera la salle de discussion.

Comme la plupart des autres applications de discussion de groupe disponibles aujourd'hui, notre application comportera les éléments d'interface utilisateur suivants:

  • Une liste qui affiche tous les messages de discussion de groupe dans un ordre chronologique
  • Un champ de saisie où l'utilisateur peut saisir un nouveau message
  • Un bouton sur lequel l'utilisateur peut appuyer pour poster le message

Donc, activity_main.xml doit avoir un ListView, un Éditer le texte, et un FloatingActionButton. Après les avoir tous placés dans un Disposition relative widget, votre mise en page XML devrait ressembler à ceci:

       

Notez que j'ai placé le Éditer le texte widget à l'intérieur d'un TextInputLayout widget. Cela ajoute une étiquette flottante à la Éditer le texte, ce qui est important si vous souhaitez respecter les directives de conception des matériaux.

Maintenant que la disposition de l'écran d'accueil est prête, nous pouvons passer à la création d'une disposition pour les messages de discussion, qui seront des éléments à l'intérieur de la fenêtre. ListView. Commencez par créer un nouveau fichier XML de mise en page appelé message.xml, dont l'élément racine est Disposition relative.

La mise en page doit avoir Affichage des widgets pour afficher le texte du message de discussion, l'heure à laquelle il a été envoyé et son auteur. Vous êtes libre de les placer dans n'importe quel ordre. Voici la mise en page que je vais utiliser:

    

4. Gérer l'authentification de l'utilisateur

Autoriser les utilisateurs à publier anonymement des messages sur le salon de discussion serait une très mauvaise idée. Cela pourrait entraîner du spam, des problèmes de sécurité et une expérience de discussion moins qu'idéale pour les utilisateurs. Par conséquent, configurons maintenant notre application de sorte que seuls les utilisateurs enregistrés puissent lire et poster des messages..

Commencez par aller au Auth section de la console Firebase et permettant Mot de passe de l'email en tant que fournisseur de connexion.

N'hésitez pas à activer également les fournisseurs de connexion OAuth 2.0. Cependant, FirebaseUI v0.6.0 prend en charge de manière transparente uniquement Google Sign-In et Facebook Login..

Étape 1: gérez la connexion de l'utilisateur

Dès que l'application démarre, elle doit vérifier si l'utilisateur est connecté. Si c'est le cas, l'application doit continuer et afficher le contenu de la salle de discussion. Sinon, l'utilisateur doit être redirigé vers un écran de connexion ou un écran de connexion. Avec FirebaseUI, la création de ces écrans nécessite beaucoup moins de code que vous ne le pensez.

À l'intérieur de onCreate () méthode de Activité principale, vérifier si l'utilisateur est déjà connecté en vérifiant si le compte actuel FirebaseUser objet n'est pas nul. Si c'est nul, vous devez créer et configurer un Intention objet qui ouvre une activité de connexion. Pour ce faire, utilisez le SignInIntentBuilder classe. Une fois l’intention prête, vous devez lancer l’activité de connexion à l’aide du bouton startActivityForResult () méthode.

Notez que l'activité de connexion permet également aux nouveaux utilisateurs de s'inscrire. Par conséquent, vous n'avez pas à écrire de code supplémentaire pour gérer l'enregistrement de l'utilisateur.

Ajoutez le code suivant au onCreate () méthode:

if (FirebaseAuth.getInstance (). getCurrentUser () == null) // Début de la connexion / de l'activité d'activité startActivityForResult (AuthUI.getInstance () .createSignInIntentBuilder () .build (), construction (), SIGN_IN_REQUEST_CODE);  else // L'utilisateur est déjà connecté. Par conséquent, affichez // un Toast Toast.makeText (this, "Welcome" + FirebaseAuth.getInstance () .getCurrentUser () .getDisplayName (), Toast.LENGTH_LONG) .show ( ) // Charge le contenu de la salle de discussion displayChatMessages (); 

Comme vous pouvez le voir dans le code ci-dessus, si l’utilisateur est déjà connecté, nous affichons d’abord un Pain grillé accueillir l’utilisateur, puis appeler une méthode nommée displayChatMessages. Pour l'instant, créez simplement un talon pour cela. Nous ajouterons du code plus tard.

displayChatMessages ()  privé privé

Une fois que l'utilisateur s'est connecté, Activité principale recevra un résultat sous la forme d'un Intention. Pour le gérer, vous devez remplacer le onActivityResult () méthode.

Si le code du résultat est RESULT_OK, cela signifie que l'utilisateur s'est connecté avec succès. Si oui, vous devez appeler le displayChatMessages () méthode à nouveau. Sinon, appelez terminer() fermer l'application.

@Override protected void onActivityResult (int requestCode, int resultCode, données d'intention) super.onActivityResult (requestCode, resultCode, data); if (requestCode == SIGN_IN_REQUEST_CODE) if (resultCode == RESULT_OK) Toast.makeText (this, "Connexion réussie. Bienvenue!", Toast.LENGTH_LONG) .show (); displayChatMessages ();  else Toast.makeText (this, "Nous ne pouvons pas vous connecter. Veuillez réessayer plus tard.", Toast.LENGTH_LONG) .show (); // Ferme l'application finish (); 

À ce stade, vous pouvez exécuter l'application et consulter les écrans de connexion et d'inscription..

Étape 2: gérer la déconnexion de l'utilisateur

Par défaut, FirebaseUI utilise Smart Lock pour les mots de passe. Par conséquent, une fois les utilisateurs connectés, ils resteront connectés même si l'application est redémarrée. Pour permettre aux utilisateurs de se déconnecter, nous allons maintenant ajouter une option de déconnexion au menu de débordement de Activité principale.

Créez un nouveau fichier de ressources de menu appelé main_menu.xml et ajouter un seul article à qui, Titre attribut est mis à Déconnexion. Le contenu du fichier devrait ressembler à ceci:

  

Pour instancier la ressource de menu à l'intérieur Activité principale, remplacer le onCreateOptionsMenu () méthode et appelez le gonfler() méthode du MenuInflater objet.

@Override public boolean onCreateOptionsMenu (menu Menu) getMenuInflater (). Inflate (R.menu.main_menu, menu); retourne vrai; 

Ensuite, remplacez le onOptionsItemSelected () méthode pour gérer les événements de clic sur l'élément de menu. Dans la méthode, vous pouvez appeler le Déconnexion() méthode du AuthUI classe pour déconnecter l'utilisateur. Comme l'opération de déconnexion est exécutée de manière asynchrone, nous ajouterons également un OnCompleteListener à cela.

@Override public boolean onOptionsItemSelected (élément MenuItem) if (item.getItemId () == R.id.menu_sign_out) AuthUI.getInstance (). SignOut (this) .addOnCompleteListener (new OnCompleteListener() @Override public void onComplete (@NonNull Task tâche) Toast.makeText (MainActivity.this, "Vous avez été déconnecté.", Toast.LENGTH_LONG) .show (); // Fermer l'activité finish (); );  return true; 

Une fois l'utilisateur déconnecté, l'application devrait se fermer automatiquement. C’est la raison pour laquelle vous voyez un appel au terminer() méthode dans le code ci-dessus.

5. Créer un modèle

Afin de stocker les messages de discussion dans la base de données en temps réel Firebase, vous devez créer un modèle pour ces messages. La présentation du message de discussion, créée précédemment dans ce didacticiel, comporte trois vues. Pour pouvoir renseigner ces vues, le modèle doit également comporter au moins trois champs..

Créez une nouvelle classe Java appelée ChatMessage.java et ajoutez-y trois variables membres: messageTexte, messageUtilisateur, et messageTime. Ajoutez également un constructeur pour initialiser ces variables.

Pour rendre le modèle compatible avec FirebaseUI, vous devez également lui ajouter un constructeur par défaut, ainsi que des getters et des setters pour toutes les variables membres..

À ce stade, le ChatMessage la classe devrait ressembler à ceci:

Classe publique ChatMessage private String messageText; private String messageUser; privé long messageTime; public ChatMessage (String messageText, String messageUser) this.messageText = messageText; this.messageUser = messageUser; // Initialisation à l'heure actuelle messageTime = new Date (). GetTime ();  public ChatMessage ()  public String getMessageText () return messageText;  public void setMessageText (String messageText) this.messageText = messageText;  public String getMessageUser () return messageUser;  public void setMessageUser (String messageUser) this.messageUser = messageUser;  public long getMessageTime () return messageTime;  public void setMessageTime (long messageTime) this.messageTime = messageTime; 

6. Poster un message de chat

Maintenant que le modèle est prêt, nous pouvons facilement ajouter de nouveaux messages de discussion à la base de données en temps réel Firebase..

Pour poster un nouveau message, l'utilisateur appuiera sur la touche FloatingActionButton. Par conséquent, vous devez ajouter un OnClickListener à cela.

À l'intérieur de l'auditeur, vous devez d'abord obtenir un Référence de la base de données objet en utilisant le getReference () méthode du FirebaseDatabase classe. Vous pouvez alors appeler le pousser() et setValue () méthodes pour ajouter de nouvelles instances du ChatMessage classe à la base de données en temps réel.

le ChatMessage bien entendu, les instances doivent être initialisées avec le contenu du Éditer le texte et le nom d'affichage de l'utilisateur actuellement connecté.

En conséquence, ajoutez le code suivant à la onCreate () méthode:

FloatingActionButton fab = (FloatingActionButton) findViewById (R.id.fab); fab.setOnClickListener (nouvelle View.OnClickListener () @Override public void onClick (Vue) EditText input = (EditText) findViewById (R.id.input); // lit le champ de saisie et envoie une nouvelle instance // de ChatMessage à la base de données Firebase FirebaseDatabase.getInstance () .getReference () .push () .setValue (new ChatMessage (input.getText (). ToString (), FirebaseAuth.getInstance () .getCurrentUser () .getCurrentUser () .getDisplayName () .get; // Efface l'entrée input.setText (""););

Les données de la base de données en temps réel Firebase sont toujours stockées sous forme de paires clé-valeur. Cependant, si vous observez le code ci-dessus, vous verrez que nous appelons setValue () sans spécifier aucune clé. Cela n'est autorisé que parce que l'appel du setValue () la méthode est précédée d'un appel à la pousser() méthode, qui génère automatiquement une nouvelle clé.

7. Afficher les messages de discussion

FirebaseUI a une classe très pratique appelée FirebaseListAdapter, qui réduit considérablement les efforts nécessaires pour peupler un ListView en utilisant les données présentes dans la base de données en temps réel Firebase. Nous allons l'utiliser maintenant pour récupérer et afficher tous les ChatMessage objets présents dans la base de données.

Ajouter un FirebaseListAdapter objet en tant que nouvelle variable membre de la Activité principale classe.

FirebaseListAdapter privé adaptateur;

À l'intérieur de displayChatMessages () méthode, initialisez l'adaptateur à l'aide de son constructeur, qui attend les arguments suivants:

  • Une référence à la Activité
  • le classe de l'objet qui vous intéresse
  • La disposition des éléments de la liste
  • UNE Référence de la base de données objet

FirebaseListAdapter est une classe abstraite et a un résumé populateView () méthode, qui doit être remplacée.

Comme son nom l'indique, populateView () est utilisé pour renseigner les vues de chaque élément de la liste. Si vous connaissez le ArrayAdapter classe, vous pouvez penser à populateView () comme alternative au getView () méthode.

À l'intérieur de la méthode, vous devez d'abord utiliser findViewById () obtenir des références à chacun Affichage c'est présent dans le message.xml fichier de mise en page. Vous pouvez alors appeler leur Définir le texte() méthodes et les peupler en utilisant les getters de la ChatMessage classe.

À ce stade, le contenu de la displayChatMessages () méthode devrait ressembler à ceci:

ListView listOfMessages = (ListView) findViewById (R.id.list_of_messages); adaptateur = new FirebaseListAdapter(this, ChatMessage.class, R.layout.message, FirebaseDatabase.getInstance (). getReference ()) @Override protected void populateView (Afficher v, modèle ChatMessage, position int) // Récupère des références aux vues du message. xml TextView messageText = (TextView) v.findViewById (R.id.message_text); TextView messageUser = (TextView) v.findViewById (R.id.message_user); TextView messageTime = (TextView) v.findViewById (R.id.message_time); // Définit leur texte messageText.setText (model.getMessageText ()); messageUser.setText (model.getMessageUser ()); // Formate la date avant de l'afficher messageTime.setText (DateFormat.format ("jj-MM-aaaa (HH: mm: ss)", model.getMessageTime ()); ; listOfMessages.setAdapter (adaptateur);

L'application de discussion de groupe est prête. Exécuter et poster de nouveaux messages pour les voir apparaître immédiatement dans le ListView. Si vous partagez l'application avec vos amis, vous devriez également pouvoir voir leurs messages dès qu'ils les publient..

Conclusion

Dans ce didacticiel, vous avez appris à utiliser Firebase et FirebaseUI pour créer une application de discussion de groupe très simple. Vous avez également constaté à quel point il est facile de travailler avec les classes disponibles dans FirebaseUI pour créer rapidement de nouveaux écrans et implémenter des fonctionnalités complexes..

Pour en savoir plus sur Firebase et FirebaseUI, reportez-vous à la documentation officielle. Ou consultez certains de nos autres didacticiels Firebase ici sur Envato Tuts+!