Firebase Android Codelab — создание дружелюбного чата

1. Обзор

Скриншот

Изображение: Рабочее приложение «Дружественный чат».

Добро пожаловать в лабораторию разработки Friendly Chat. В этой лабораторной работе вы узнаете, как использовать платформу Firebase для создания приложения для чата на Android.

Что вы узнаете

  • Как использовать аутентификацию Firebase, чтобы разрешить пользователям входить в систему.
  • Как синхронизировать данные с помощью базы данных Firebase Realtime.
  • Как хранить двоичные файлы в Cloud Storage для Firebase.
  • Как использовать пакет локального эмулятора Firebase для разработки приложения Android с помощью Firebase.

Что вам понадобится

  • Последняя версия Android Studio .
  • Эмулятор Android с Android 5.0+.
  • Node.js версии 10 или выше (для использования Emulator Suite).
  • Java 8 или выше. Для установки Java используйте эти инструкции ; чтобы проверить вашу версию, запустите java -version .
  • Знание языка программирования Kotlin.

2. Получите пример кода

Клонировать репозиторий

Клонируйте репозиторий GitHub из командной строки:

$ git clone https://github.com/firebase/codelab-friendlychat-android

Импортировать в Android Studio

В Android Studio выберите «Файл» > «Открыть» , затем выберите каталог build-android-start ( android_studio_folder ) из каталога, в который вы загрузили пример кода.

Теперь у вас должен быть открыт проект build-android-start в Android Studio. Если вы видите предупреждение об отсутствии файла google-services.json , не волнуйтесь. Он будет добавлен на более позднем этапе.

Проверьте зависимости

В этой кодовой лаборатории все необходимые вам зависимости уже добавлены, но важно понимать, как добавить Firebase SDK в ваше приложение:

build.gradle.kts

plugins {
    id("com.android.application") version "8.0.0" apply false
    id("com.android.library") version "8.0.0" apply false
    id("org.jetbrains.kotlin.android") version "1.8.20" apply false

    // The google-services plugin is required to parse the google-services.json file
    id("com.google.gms.google-services") version "4.3.15" apply false
}

приложение/build.gradle.kts

plugins {
    id("com.android.application")
    id("kotlin-android")
    id("com.google.gms.google-services")
}

android {
    // ...
}

dependencies {
    // ...

    // Google Sign In SDK
    implementation("com.google.android.gms:play-services-auth:20.5.0")

    // Firebase SDK
    implementation(platform("com.google.firebase:firebase-bom:32.0.0"))
    implementation("com.google.firebase:firebase-database-ktx")
    implementation("com.google.firebase:firebase-storage-ktx")
    implementation("com.google.firebase:firebase-auth-ktx")

    // Firebase UI Library
    implementation("com.firebaseui:firebase-ui-auth:8.0.2")
    implementation("com.firebaseui:firebase-ui-database:8.0.2")
}

3. Установите интерфейс командной строки Firebase.

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

Установите интерфейс командной строки Firebase

Сначала вам нужно будет установить Firebase CLI . Если вы используете macOS или Linux, вы можете запустить следующую команду cURL:

curl -sL https://firebase.tools | bash

Если вы используете Windows, прочтите инструкции по установке , чтобы получить отдельный двоичный файл, или установите его через npm .

После установки CLI запуск firebase --version должен сообщить о версии 9.0.0 или выше:

$ firebase --version
9.0.0

Авторизоваться

Запустите firebase login , чтобы подключить CLI к вашей учетной записи Google. Откроется новое окно браузера для завершения процесса входа в систему. Обязательно выберите ту же учетную запись, которую вы использовали при создании проекта Firebase ранее.

4. Подключитесь к набору эмуляторов Firebase.

Запустите эмуляторы

В своем терминале запустите следующую команду из корня локального каталога codelab-friendlychat-android :

firebase emulators:start --project=demo-friendlychat-android

Вы должны увидеть такие журналы. Значения портов были определены в файле firebase.json , который был включен в клонированный пример кода.

$ firebase emulators:start --project=demo-friendlychat-android
i  emulators: Starting emulators: auth, database, storage
i  emulators: Detected demo project ID "demo-friendlychat-android", emulated services will use a demo configuration and attempts to access non-emulated services for this project will fail.
i  database: Database Emulator logging to database-debug.log
i  ui: Emulator UI logging to ui-debug.log

┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
│ i  View Emulator UI at http://localhost:4000                │
└─────────────────────────────────────────────────────────────┘

┌────────────────┬────────────────┬────────────────────────────────┐
│ Emulator       │ Host:Port      │ View in Emulator UI            │
├────────────────┼────────────────┼────────────────────────────────┤
│ Authentication │ localhost:9099 │ http://localhost:4000/auth     │
├────────────────┼────────────────┼────────────────────────────────┤
│ Database       │ localhost:9000 │ http://localhost:4000/database │
├────────────────┼────────────────┼────────────────────────────────┤
│ Storage        │ localhost:9199 │ http://localhost:4000/storage  │
└────────────────┴────────────────┴────────────────────────────────┘
  Emulator Hub running at localhost:4400
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

Перейдите по адресу http://localhost:4000 в веб-браузере, чтобы просмотреть пользовательский интерфейс Firebase Emulator Suite:

Домашняя страница пользовательского интерфейса Emulator Suite

Оставьте команду emulators:start работающей до конца работы над кодом.

Подключите свое приложение

В Android Studio откройте MainActivity.kt , затем добавьте следующий код в метод onCreate :

// When running in debug mode, connect to the Firebase Emulator Suite.
// "10.0.2.2" is a special IP address which allows the Android Emulator
// to connect to "localhost" on the host computer. The port values (9xxx)
// must match the values defined in the firebase.json file.
if (BuildConfig.DEBUG) {
    Firebase.database.useEmulator("10.0.2.2", 9000)
    Firebase.auth.useEmulator("10.0.2.2", 9099)
    Firebase.storage.useEmulator("10.0.2.2", 9199)
}

5. Запустите стартовое приложение.

Добавьте google-services.json

Чтобы ваше приложение Android могло подключаться к Firebase, вам необходимо добавить файл google-services.json в папку app вашего проекта Android. Для целей этой лаборатории мы предоставили макет JSON-файла, который позволит вам подключиться к пакету эмуляторов Firebase.

Скопируйте файл mock-google-services.json в папку build-android-start/app как google-services.json :

cp mock-google-services.json build-android-start/app/google-services.json

На последнем этапе этой лабораторной работы вы узнаете, как создать настоящий проект Firebase и приложение Firebase для Android, чтобы можно было заменить этот фиктивный файл JSON своей собственной конфигурацией.

Запустите приложение

Теперь, когда вы импортировали проект в Android Studio и добавили JSON-файл конфигурации Firebase, вы готовы впервые запустить приложение.

  1. Запустите эмулятор Android.
  2. В Android Studio нажмите «Выполнить» ( выполнять ) на панели инструментов.

Приложение должно запуститься на вашем эмуляторе Android. На этом этапе вы должны увидеть пустой список сообщений, а отправка и получение сообщений работать не будут. На следующем этапе этой лабораторной работы вы будете аутентифицировать пользователей, чтобы они могли использовать дружеский чат.

6. Включите аутентификацию

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

Добавьте базовую функцию входа в систему

Далее мы добавим в приложение базовый код аутентификации Firebase для обнаружения пользователей и реализации экрана входа.

Проверить текущего пользователя

Сначала добавьте следующую переменную экземпляра в класс MainActivity.kt :

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Теперь давайте изменим MainActivity , чтобы он отправлял пользователя на экран входа каждый раз, когда он открывает приложение и не проходит проверку подлинности. Добавьте следующее в метод onCreate() после прикрепления binding к представлению:

MainActivity.kt

// Initialize Firebase Auth and check if the user is signed in
auth = Firebase.auth
if (auth.currentUser == null) {
    // Not signed in, launch the Sign In activity
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
    return
}

Мы также хотим проверить, вошел ли пользователь в систему во время onStart() :

MainActivity.kt

public override fun onStart() {
    super.onStart()
    // Check if user is signed in.
    if (auth.currentUser == null) {
        // Not signed in, launch the Sign In activity
        startActivity(Intent(this, SignInActivity::class.java))
        finish()
        return
    }
}

Затем реализуйте методы getUserPhotoUrl() и getUserName() , чтобы вернуть соответствующую информацию о текущем аутентифицированном пользователе Firebase:

MainActivity.kt

private fun getPhotoUrl(): String? {
    val user = auth.currentUser
    return user?.photoUrl?.toString()
}

private fun getUserName(): String? {
    val user = auth.currentUser
    return if (user != null) {
        user.displayName
    } else ANONYMOUS
}

Затем реализуйте метод signOut() для обработки кнопки выхода:

MainActivity.kt

private fun signOut() {
    AuthUI.getInstance().signOut()
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
}

Теперь у нас есть вся логика для отправки пользователя на экран входа в систему, когда это необходимо. Далее нам нужно реализовать экран входа в систему для правильной аутентификации пользователей.

Реализация экрана входа в систему

Откройте файл SignInActivity.kt . Здесь для инициации аутентификации используется простая кнопка входа в систему. В этом разделе вы будете использовать FirebaseUI для реализации логики входа в систему.

Добавьте переменную экземпляра Auth в класс SignInActivity под комментарием // Firebase instance variables :

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Затем отредактируйте метод onCreate() , чтобы инициализировать Firebase так же, как вы это делали в MainActivity :

SignInActivity.kt

// Initialize FirebaseAuth
auth = Firebase.auth

Добавьте поле ActivityResultLauncher в SignInActivity :

SignInActivity.kt

// ADD THIS
private val signIn: ActivityResultLauncher<Intent> =
        registerForActivityResult(FirebaseAuthUIActivityResultContract(), this::onSignInResult)

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
}

Затем отредактируйте метод onStart() , чтобы запустить процесс входа в FirebaseUI:

SignInActivity.kt

public override fun onStart() {
    super.onStart()

    // If there is no signed in user, launch FirebaseUI
    // Otherwise head to MainActivity
    if (Firebase.auth.currentUser == null) {
        // Sign in with FirebaseUI, see docs for more details:
        // https://firebase.google.com/docs/auth/android/firebaseui
        val signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setLogo(R.mipmap.ic_launcher)
                .setAvailableProviders(listOf(
                        AuthUI.IdpConfig.EmailBuilder().build(),
                        AuthUI.IdpConfig.GoogleBuilder().build(),
                ))
                .build()

        signIn.launch(signInIntent)
    } else {
        goToMainActivity()
    }
}

Затем реализуйте метод onSignInResult для обработки результата входа в систему. Если результат входа был успешным, перейдите к MainActivity :

SignInActivity.kt

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    if (result.resultCode == RESULT_OK) {
        Log.d(TAG, "Sign in successful!")
        goToMainActivity()
    } else {
        Toast.makeText(
                this,
                "There was an error signing in",
                Toast.LENGTH_LONG).show()

        val response = result.idpResponse
        if (response == null) {
            Log.w(TAG, "Sign in canceled")
        } else {
            Log.w(TAG, "Sign in error", response.error)
        }
    }
}

Вот и все! Вы реализовали аутентификацию с помощью FirebaseUI всего за несколько вызовов методов и без необходимости управлять какой-либо конфигурацией на стороне сервера.

Проверьте свою работу

Запустите приложение на своем эмуляторе Android. Вы должны быть немедленно перенаправлены на экран входа в систему. Нажмите кнопку «Войти по электронной почте» , затем создайте учетную запись. Если все реализовано правильно, вас должен отправить на экран сообщений.

После входа в систему откройте пользовательский интерфейс Firebase Emulator Suite в своем браузере, затем перейдите на вкладку «Аутентификация» , чтобы увидеть первую вошедшую в систему учетную запись пользователя.

7. Читать сообщения

На этом этапе мы добавим функциональность для чтения и отображения сообщений, хранящихся в базе данных реального времени.

Импортировать примеры сообщений

  1. В пользовательском интерфейсе Firebase Emulator Suite выберите вкладку «База данных реального времени» .
  2. Перетащите файл initial_messages.json из локальной копии репозитория Codelab в средство просмотра данных.

Теперь у вас должно быть несколько сообщений в узле messages базы данных.

Чтение данных

Синхронизировать сообщения

В этом разделе мы добавляем код, который синхронизирует вновь добавленные сообщения с пользовательским интерфейсом приложения:

  • Инициализация базы данных Firebase Realtime и добавление прослушивателя для обработки изменений, внесенных в данные.
  • Обновление адаптера RecyclerView для отображения новых сообщений.
  • Добавление переменных экземпляра базы данных с другими переменными экземпляра Firebase в классе MainActivity :

MainActivity.kt

// Firebase instance variables
// ...
private lateinit var db: FirebaseDatabase
private lateinit var adapter: FriendlyMessageAdapter

Измените метод onCreate() вашей MainActivity под комментарием // Initialize Realtime Database and FirebaseRecyclerAdapter с помощью кода, определенного ниже. Этот код добавляет все существующие сообщения из базы данных реального времени, а затем прослушивает новые дочерние записи по пути к messages в вашей базе данных Firebase Realtime. Он добавляет новый элемент в пользовательский интерфейс для каждого сообщения:

MainActivity.kt

// Initialize Realtime Database
db = Firebase.database
val messagesRef = db.reference.child(MESSAGES_CHILD)

// The FirebaseRecyclerAdapter class and options come from the FirebaseUI library
// See: https://github.com/firebase/FirebaseUI-Android
val options = FirebaseRecyclerOptions.Builder<FriendlyMessage>()
    .setQuery(messagesRef, FriendlyMessage::class.java)
    .build()
adapter = FriendlyMessageAdapter(options, getUserName())
binding.progressBar.visibility = ProgressBar.INVISIBLE
manager = LinearLayoutManager(this)
manager.stackFromEnd = true
binding.messageRecyclerView.layoutManager = manager
binding.messageRecyclerView.adapter = adapter

// Scroll down when a new message arrives
// See MyScrollToBottomObserver for details
adapter.registerAdapterDataObserver(
    MyScrollToBottomObserver(binding.messageRecyclerView, adapter, manager)
)

Далее в классе FriendlyMessageAdapter.kt реализуем метод bind() внутри внутреннего класса MessageViewHolder() :

FriendlyMessageAdapter.kt

inner class MessageViewHolder(private val binding: MessageBinding) : ViewHolder(binding.root) {
    fun bind(item: FriendlyMessage) {
        binding.messageTextView.text = item.text
        setTextColor(item.name, binding.messageTextView)

        binding.messengerTextView.text = if (item.name == null) ANONYMOUS else item.name
        if (item.photoUrl != null) {
            loadImageIntoView(binding.messengerImageView, item.photoUrl!!)
        } else {
            binding.messengerImageView.setImageResource(R.drawable.ic_account_circle_black_36dp)
        }
    }
    ...
}

Нам также необходимо отображать сообщения, которые являются изображениями, поэтому реализуйте метод bind() внутри внутреннего класса ImageMessageViewHolder() :

FriendlyMessageAdapter.kt

inner class ImageMessageViewHolder(private val binding: ImageMessageBinding) :
    ViewHolder(binding.root) {
    fun bind(item: FriendlyMessage) {
        loadImageIntoView(binding.messageImageView, item.imageUrl!!)

        binding.messengerTextView.text = if (item.name == null) ANONYMOUS else item.name
        if (item.photoUrl != null) {
            loadImageIntoView(binding.messengerImageView, item.photoUrl!!)
        } else {
            binding.messengerImageView.setImageResource(R.drawable.ic_account_circle_black_36dp)
        }
    }
}

Наконец, вернувшись в MainActivity , запустите и остановите прослушивание обновлений из базы данных Firebase Realtime. Обновите методы onPause() и onResume() в MainActivity , как показано ниже:

MainActivity.kt

public override fun onPause() {
    adapter.stopListening()
    super.onPause()
}

public override fun onResume() {
    super.onResume()
    adapter.startListening()
}

Проверка синхронизации сообщений

  1. Нажмите «Выполнить» ( выполнять ).
  2. В пользовательском интерфейсе Emulator Suite вернитесь на вкладку «База данных реального времени» , а затем вручную добавьте новое сообщение. Убедитесь, что сообщение отображается в вашем приложении Android:

Поздравляем, вы только что добавили в свое приложение базу данных реального времени!

8. Отправляйте сообщения

Реализуйте отправку текстовых сообщений

В этом разделе вы добавите пользователям приложения возможность отправлять текстовые сообщения. Приведенный ниже фрагмент кода прослушивает события нажатия кнопки отправки, создает новый объект FriendlyMessage с содержимым поля сообщения и отправляет сообщение в базу данных. Метод push() добавляет автоматически сгенерированный идентификатор к пути отправляемого объекта. Эти идентификаторы являются последовательными, что гарантирует добавление новых сообщений в конец списка.

Обновите прослушиватель кликов кнопки отправки в методе onCreate() в классе MainActivity . Этот код уже находится в нижней части метода onCreate() . Обновите тело onClick() , чтобы оно соответствовало приведенному ниже коду:

MainActivity.kt

// Disable the send button when there's no text in the input field
// See MyButtonObserver for details
binding.messageEditText.addTextChangedListener(MyButtonObserver(binding.sendButton))

// When the send button is clicked, send a text message
binding.sendButton.setOnClickListener {
    val friendlyMessage = FriendlyMessage(
        binding.messageEditText.text.toString(),
        getUserName(),
        getPhotoUrl(),
        null /* no image */
    )
    db.reference.child(MESSAGES_CHILD).push().setValue(friendlyMessage)
    binding.messageEditText.setText("")
}

Реализация отправки графического сообщения

В этом разделе вы добавите пользователям приложения возможность отправлять графические сообщения. Создание графического сообщения выполняется с помощью следующих шагов:

  • Выберите изображение
  • Обработка выбора изображения
  • Запись временного графического сообщения в базу данных реального времени.
  • Начать загрузку выбранного изображения
  • Обновите URL-адрес сообщения изображения на URL-адрес загруженного изображения после завершения загрузки.

Выберите изображение

Для добавления изображений в этой лаборатории кода используется Cloud Storage for Firebase. Облачное хранилище — хорошее место для хранения двоичных данных вашего приложения.

Обработка выбора изображения и запись временного сообщения

Как только пользователь выбрал изображение, запускается Intent выбора изображения. Это уже реализовано в коде в конце метода onCreate() . По завершении он вызывает метод onImageSelected() MainActivity . Используя приведенный ниже фрагмент кода, вы напишете в базу данных сообщение с URL-адресом временного изображения, указывающее, что изображение загружается.

MainActivity.kt

private fun onImageSelected(uri: Uri) {
    Log.d(TAG, "Uri: $uri")
    val user = auth.currentUser
    val tempMessage = FriendlyMessage(null, getUserName(), getPhotoUrl(), LOADING_IMAGE_URL)
    db.reference
            .child(MESSAGES_CHILD)
            .push()
            .setValue(
                    tempMessage,
                    DatabaseReference.CompletionListener { databaseError, databaseReference ->
                        if (databaseError != null) {
                            Log.w(
                                    TAG, "Unable to write message to database.",
                                    databaseError.toException()
                            )
                            return@CompletionListener
                        }

                        // Build a StorageReference and then upload the file
                        val key = databaseReference.key
                        val storageReference = Firebase.storage
                                .getReference(user!!.uid)
                                .child(key!!)
                                .child(uri.lastPathSegment!!)
                        putImageInStorage(storageReference, uri, key)
                    })
}

Загрузите изображение и обновите сообщение

Добавьте метод putImageInStorage() в MainActivity . Он вызывается в onImageSelected() , чтобы инициировать загрузку выбранного изображения. После завершения загрузки вы обновите сообщение, используя соответствующее изображение.

MainActivity.kt

private fun putImageInStorage(storageReference: StorageReference, uri: Uri, key: String?) {
    // First upload the image to Cloud Storage
    storageReference.putFile(uri)
        .addOnSuccessListener(
            this
        ) { taskSnapshot -> // After the image loads, get a public downloadUrl for the image
            // and add it to the message.
            taskSnapshot.metadata!!.reference!!.downloadUrl
                .addOnSuccessListener { uri ->
                    val friendlyMessage =
                        FriendlyMessage(null, getUserName(), getPhotoUrl(), uri.toString())
                    db.reference
                        .child(MESSAGES_CHILD)
                        .child(key!!)
                        .setValue(friendlyMessage)
                }
        }
        .addOnFailureListener(this) { e ->
            Log.w(
                TAG,
                "Image upload task was unsuccessful.",
                e
            )
        }
}

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

  1. В Android Studio нажмите кнопку выполнять Кнопка запуска .
  2. В эмуляторе Android введите сообщение, затем нажмите кнопку «Отправить». Новое сообщение должно быть видно в пользовательском интерфейсе приложения и в пользовательском интерфейсе Firebase Emulator Suite.
  3. В эмуляторе Android коснитесь изображения «+», чтобы выбрать изображение на вашем устройстве. Новое сообщение должно быть видно сначала с изображением-заполнителем, а затем с выбранным изображением после завершения загрузки изображения. Новое сообщение также должно быть видно в пользовательском интерфейсе Emulator Suite, в частности, как объект на вкладке «База данных реального времени» и как объект на вкладке «Хранилище».

9. Поздравляем!

Вы только что создали приложение для чата в реальном времени с помощью Firebase!

Что вы узнали

  • Аутентификация Firebase
  • База данных Firebase в реальном времени
  • Облачное хранилище для Firebase

Затем попробуйте использовать то, что вы узнали в этой лаборатории кода, чтобы добавить Firebase в свое собственное приложение для Android! Чтобы узнать больше о Firebase, посетите firebase.google.com .

Если вы хотите узнать, как настроить настоящий проект Firebase и использовать реальные ресурсы Firebase (вместо демонстрационного проекта и только эмулированных ресурсов), перейдите к следующему шагу.

Примечание. Даже после того, как вы настроили настоящий проект Firebase и особенно когда вы начали создавать настоящее приложение, мы рекомендуем использовать пакет локального эмулятора Firebase для разработки и тестирования.

10. Необязательно: создайте и настройте проект Firebase.

На этом этапе вы создадите настоящий проект Firebase и приложение Firebase для Android, которое будет использоваться с этой лабораторией кода. Вы также добавите в свое приложение конфигурацию Firebase для конкретного приложения. И, наконец, вы настроите настоящие ресурсы Firebase для использования в своем приложении.

Создать проект Firebase

  1. В браузере перейдите в консоль Firebase .
  2. Выберите Добавить проект .
  3. Выберите или введите имя проекта. Вы можете использовать любое имя, какое захотите.
  4. Для этой лаборатории кода вам не нужна Google Analytics, поэтому вы можете не включать ее для своего проекта.
  5. Нажмите Создать проект . Когда ваш проект будет готов, нажмите «Продолжить» .

Добавьте Firebase в свой проект Android

Прежде чем приступить к этому шагу, получите хэш SHA1 вашего приложения. Запустите следующую команду из локального каталога build-android-start , чтобы определить SHA1 вашего ключа отладки:

./gradlew signingReport

Store: /Users/<username>/.android/debug.keystore
Alias: AndroidDebugKey
MD5: A5:88:41:04:8F:06:59:6A:AE:33:76:87:AA:AD:19:23
SHA1: A7:89:F5:06:A8:07:A1:22:EC:90:6A:A6:EA:C3:D4:8B:3A:30:AB:18
SHA-256: 05:A2:2A:35:EE:F2:51:23:72:4D:72:67:A5:6A:8A:58:22:2C:00:A6:AB:F6:45:D5:A1:82:D8:90:A4:69:C8:FE
Valid until: Wednesday, August 10, 2044

Вы должны увидеть вывод, подобный приведенному выше. Важная строка — это хеш SHA1 . Если вы не можете найти свой хэш SHA1, посетите эту страницу для получения дополнительной информации.

Вернитесь в консоль Firebase и выполните следующие действия, чтобы зарегистрировать проект Android в проекте Firebase:

  1. На обзорном экране вашего нового проекта щелкните значок Android, чтобы запустить рабочий процесс установки: добавить приложение для Android
  2. На следующем экране введите com.google.firebase.codelab.friendlychat в качестве имени пакета для вашего приложения.
  3. Нажмите «Зарегистрировать приложение» , затем нажмите «Загрузить google-services.json» , чтобы загрузить файл конфигурации Firebase.
  4. Скопируйте файл google-services.json в каталог app вашего проекта Android.
  5. Пропустите следующие шаги, показанные в рабочем процессе настройки консоли (они уже были выполнены за вас в проекте build-android-start ).
  6. Убедитесь, что все зависимости доступны для вашего приложения, синхронизировав проект с файлами Gradle. На панели инструментов Android Studio выберите «Файл» > «Синхронизировать проект с файлами Gradle» . Вам также может потребоваться запустить проект сборки/очистки и проект сборки/перестройки , чтобы изменения конфигурации вступили в силу.

Настройка аутентификации Firebase

Прежде чем ваше приложение сможет получить доступ к API-интерфейсам аутентификации Firebase от имени ваших пользователей, вам необходимо включить аутентификацию Firebase и поставщиков входа в систему, которых вы хотите использовать в своем приложении.

  1. В консоли Firebase выберите «Аутентификация» на левой навигационной панели.
  2. Выберите вкладку «Метод входа» .
  3. Нажмите «Электронная почта/пароль» и переведите переключатель в положение «включено» (синий).
  4. Нажмите Google , затем переведите переключатель в положение «включено» (синий) и настройте адрес электронной почты поддержки проекта.

Если позже в этой лаборатории кода вы получите ошибки с сообщением «CONFIGURATION_NOT_FOUND», вернитесь к этому шагу и еще раз проверьте свою работу.

Настройка базы данных реального времени

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

  1. В консоли Firebase выберите «База данных реального времени» на левой навигационной панели.
  2. Нажмите «Создать базу данных» , чтобы создать новый экземпляр базы данных реального времени. При появлении запроса выберите регион us-central1 и нажмите «Далее» .
  3. При появлении запроса о правилах безопасности выберите режим блокировки и нажмите «Включить» .
  4. После создания экземпляра базы данных выберите вкладку «Правила» , затем обновите конфигурацию правил, указав следующее:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

Дополнительную информацию о том, как работают правила безопасности (включая документацию по переменной «auth»), см. в документации по безопасности базы данных реального времени .

Настройка облачного хранилища для Firebase

  1. В консоли Firebase выберите «Хранилище» на левой навигационной панели.
  2. Нажмите «Начать» , чтобы включить облачное хранилище для вашего проекта.
  3. Следуйте инструкциям в диалоговом окне, чтобы настроить сегмент, используя предложенные значения по умолчанию.

Подключитесь к ресурсам Firebase

На предыдущем этапе этой лаборатории кода вы добавили следующее в MainActivity.kt . Этот условный блок соединил ваш проект Android с пакетом эмуляторов Firebase.

// REMOVE OR DISABLE THIS
if (BuildConfig.DEBUG) {
    Firebase.database.useEmulator("10.0.2.2", 9000)
    Firebase.auth.useEmulator("10.0.2.2", 9099)
    Firebase.storage.useEmulator("10.0.2.2", 9199)
}

Если вы хотите подключить свое приложение к новому реальному проекту Firebase и его реальным ресурсам Firebase, вы можете либо удалить этот блок, либо запустить приложение в режиме выпуска, чтобы BuildConfig.DEBUG имел значение false .