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

1. Обзор

скриншот

Изображение: Работающее приложение Friendly Chat.

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

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

  • Как использовать аутентификацию Firebase для авторизации пользователей.
  • Как синхронизировать данные с помощью базы данных Firebase Realtime Database.
  • Как хранить бинарные файлы в Cloud Storage для Firebase.
  • Как использовать Firebase Local Emulator Suite для разработки 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
}

app/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 CLI.

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

Установите Firebase CLI.

Сначала вам потребуется установить 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 Emulator Suite.

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

В терминале выполните следующую команду из корневой директории локальной директории 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.

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

Главная страница пользовательского интерфейса 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 Emulator Suite.

Скопируйте файл 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. На этом этапе вы должны увидеть пустой список сообщений, и отправка и получение сообщений работать не будут. На следующем шаге этого практического занятия вы аутентифицируете пользователей, чтобы они могли использовать Friendly Chat.

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

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

Добавить базовую функциональность авторизации.

Далее мы добавим в приложение базовый код аутентификации 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. Читайте сообщения

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

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

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

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

Прочитать данные

Синхронизация сообщений

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

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

MainActivity.kt

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

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

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 Database. Обновите методы 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. Cloud Storage — хорошее место для хранения бинарных данных вашего приложения.

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

После того, как пользователь выберет изображение, запускается 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, а именно как объект на вкладке "База данных в реальном времени" и как объект типа "blob" на вкладке "Хранилище".

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

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

Что вы узнали

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

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

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

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

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

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

Создайте проект Firebase.

  1. Войдите в консоль Firebase, используя свою учетную запись Google.
  2. Нажмите кнопку, чтобы создать новый проект, а затем введите название проекта (например, FriendlyChat ).
  3. Нажмите «Продолжить» .
  4. Если появится запрос, ознакомьтесь с условиями использования Firebase и примите их, после чего нажмите «Продолжить» .
  5. (Необязательно) Включите помощь ИИ в консоли Firebase (в Firebase она называется "Gemini").
  6. Для этого практического занятия вам не понадобится Google Analytics, поэтому отключите эту опцию.
  7. Нажмите «Создать проект» , дождитесь завершения подготовки проекта, а затем нажмите «Продолжить» .

Обновите свой тарифный план Firebase.

Для использования Cloud Storage for Firebase ваш проект Firebase должен быть подключен к тарифному плану с оплатой по мере использования (Blaze) , то есть он должен быть связан с учетной записью Cloud Billing .

Чтобы перейти на тарифный план Blaze для вашего проекта, выполните следующие шаги:

  1. В консоли Firebase выберите вариант обновления вашего тарифного плана .
  2. Выберите тарифный план Blaze. Следуйте инструкциям на экране, чтобы связать учетную запись Cloud Billing с вашим проектом.
    Если в рамках этого обновления вам потребовалось создать учетную запись Cloud Billing, возможно, вам нужно будет вернуться к процессу обновления в консоли Firebase, чтобы завершить обновление.

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

В консоли 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 . Возможно, вам также потребуется запустить команды Build/Clean Project и Build/Rebuild Project, чтобы изменения конфигурации вступили в силу.

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

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

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

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

Для использования функции «Вход через Google» может потребоваться указать SHA-отпечаток вашего приложения. Это можно сделать на странице настроек консоли Firebase. Подробную информацию о том, как получить SHA-отпечаток вашего приложения, см. в разделе «Аутентификация клиента» .

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

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

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

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

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

  1. В левой панели консоли Firebase разверните раздел «Сборка» , а затем выберите «Хранилище» .
  2. Нажмите « Начать» .
  3. Выберите местоположение для вашего хранилища по умолчанию.
    Для регионов US-WEST1 , US-CENTRAL1 и US-EAST1 доступен тариф "Всегда бесплатно" от Google Cloud Storage. Для регионов во всех остальных регионах действуют тарифные планы и правила использования Google Cloud Storage .
  4. Нажмите «Пуск» в тестовом режиме . Ознакомьтесь с отказом от ответственности в отношении правил безопасности.
    В дальнейшем в этом практическом занятии вы добавите правила безопасности для защиты ваших данных. Не распространяйте и не предоставляйте публичный доступ к приложению без добавления правил безопасности для вашего хранилища.
  5. Нажмите «Создать» .

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

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

// 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 .