Android Чат: Firebase, БД и исправление ошибок

Этот урок посвящен созданию функционального чата в Android-приложении с использованием базы данных Firebase. Рассмотрим подключение библиотек, авторизацию пользователей и отображение сообщений.

Исправление ошибок из предыдущего урока

Перед началом работы необходимо исправить ошибку в наименовании изображения кнопки (было «acids and батон», должно быть «ic_send_button»). Для исправления:

  1. Найдите файл изображения (res/drawable/…).
  2. Переименуйте файл в ic_send_button (все буквы в нижнем регистре). Используйте функцию переименования IDE с обновлением ссылок.
  3. Выполните Build -> Make Project.

Авторизация пользователя и подключение библиотек

В MainActivity.java необходимо проверить авторизацию пользователя в Firebase. Подключите необходимые библиотеки:

  1. Откройте build.gradle (Module: app).
  2. В секции dependencies добавьте:
implementation platform('com.google.firebase:firebase-bom:32.2.3')
implementation 'com.google.firebase:firebase-auth-ktx'
implementation 'com.google.firebase:firebase-database-ktx'
  1. Синхронизируйте проект.

Проверку авторизации выполните так:

FirebaseAuth.getInstance().getCurrentUser();

getCurrentUser() вернет null, если пользователь не авторизован.

Авторизация через FirebaseUI

Для авторизации неавторизованного пользователя используйте FirebaseAuthUI:

  1. В build.gradle (Module: app) добавьте:
implementation 'com.firebaseui:firebase-ui-auth:8.0.2'
  1. Синхронизируйте проект.
  2. В MainActivity.java используйте:
startActivityForResult(AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .build(), SIGN_IN_CODE);

где providers — список провайдеров авторизации, а SIGN_IN_CODE — уникальный код запроса. Это запустит экран авторизации FirebaseUI. Результат обработается в onActivityResult().

Обработка результата авторизации и отображение сообщений

Метод onActivityResult() обрабатывает результат авторизации:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SIGN_IN_CODE) {
        if (resultCode == RESULT_OK) {
            displayAllMessages();
            Snackbar.make(findViewById(R.id.activity_main), "Вы авторизованы", Snackbar.LENGTH_LONG).show();
        } else {
            Snackbar.make(findViewById(R.id.activity_main), "Вы не авторизованы", Snackbar.LENGTH_LONG).show();
            finish();
        }
    }
}

Функция displayAllMessages() (реализация не приведена) отображает сообщения из Firebase, используя FirebaseListAdapter, ListView и layout элемента списка (list_item.xml с тремя TextView для имени пользователя, времени и текста сообщения).

Отправка сообщений

Обработчик события кнопки отправки:

sendButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        String messageText = messageField.getText().toString();
        if (!messageText.isEmpty()) {
            DatabaseReference messagesRef = FirebaseDatabase.getInstance().getReference().child("messages");
            Message message = new Message(FirebaseAuth.getInstance().getCurrentUser().getEmail(), messageText);
            messagesRef.push().setValue(message);
            messageField.setText("");
        }
    }
});

Этот код получает текст, создает объект Message, добавляет его в Firebase и очищает текстовое поле.

Настройка правил безопасности Firebase

В консоли Firebase, в разделе «Database» > «Rules», настройте правила:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

Это разрешит чтение и запись данных.

В этом уроке создан простой чат с Firebase. Рассмотрены подключение библиотек, авторизация, отображение и отправка сообщений. В следующих уроках улучшим дизайн и добавим функции.

Что будем искать? Например,программа