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

1. Обзор

Скриншот

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

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

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

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

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

  • Android Studio версии 4.2+.
  • Эмулятор Android с Android 5.0+.
  • Ява 7 или выше. Для установки Java используйте эти инструкции ; чтобы проверить свою версию, запустите java -version .
  • Знание языка программирования Kotlin.

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

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

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

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

Импорт в Android Studio

В Android Studio выберите File > Open , затем выберите каталог build-android-start ( android_studio_folder ) из каталога, в который вы скачали пример кода.

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

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

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

build.gradle

buildscript {
    // ...

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.2'

        // The google-services plugin is required to parse the google-services.json file
        classpath 'com.google.gms:google-services:4.3.5'
    }
}

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

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:19.0.0'

    // Firebase SDK
    implementation platform('com.google.firebase:firebase-bom:26.6.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:7.2.0'
    implementation 'com.firebaseui:firebase-ui-database:7.2.0'
}

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

Чтобы запустить Firebase Emulator Suite , вам необходимо установить и использовать Firebase CLI .

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

Вариант 1 — установить с помощью npm

Если на вашем компьютере уже установлены Node.js и npm, вы можете установить CLI с помощью следующей команды:

npm install -g firebase-tools@latest

Вариант 2 — установить автономный двоичный файл

Если у вас нет Node.js/npm или вы новичок в разработке приложений, вы можете установить CLI как отдельный двоичный файл, следуя инструкциям для своей платформы здесь .

Проверить установку

После установки Firebase CLI выполните следующую команду, чтобы убедиться, что у вас установлена ​​версия 9.11.0 или выше:

firebase --version

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

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 из вашей локальной копии репозитория кода в средство просмотра данных.

Теперь у вас должно быть несколько сообщений в узле 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. Он добавляет новый элемент в пользовательский интерфейс для каждого сообщения:

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-адреса загруженного изображения после завершения загрузки.

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

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

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

После того, как пользователь выбрал изображение, запускается Intent выбора изображения. Это уже реализовано в коде в конце метода onCreate() . По завершении вызывается MainActivity onImageSelected() . Используя приведенный ниже фрагмент кода, вы напишете в базу данных сообщение с временным 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 Local Emulator Suite для разработки и тестирования.

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

На этом шаге вы создадите реальный проект Firebase и Android-приложение Firebase для использования с этой лабораторией кода. Вы также добавите в приложение конфигурацию 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, чтобы запустить рабочий процесс установки: добавить приложение для андроид
  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 выберите File > Sync Project with Gradle Files . Вам также может потребоваться запустить Build/Clean Project и Build/Rebuild Project , чтобы изменения конфигурации вступили в силу.

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

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

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

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

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

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

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