Firebase Android Codelab - 构建友好的聊天功能

1. 概览

屏幕截图

图片:方便使用的聊天应用。

欢迎学习 Friendly Chat Codelab。在此 Codelab 中,您将学习如何使用 Firebase 平台在 Android 上创建聊天应用。

学习内容

  • 如何使用 Firebase Authentication 允许用户登录。
  • 如何使用 Firebase Realtime Database 同步数据。
  • 如何在 Cloud Storage for Firebase 中存储二进制文件。
  • 如何使用 Firebase Local Emulator Suite 通过 Firebase 开发 Android 应用。

您需要满足的条件

  • 最新的 Android Studio 版本。
  • 搭载 Android 5.0 及更高版本的 Android 模拟器
  • 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 中,依次选择 File > Open,然后从下载示例代码的目录中选择 build-android-start 目录 ( android_studio_folder)。

现在,您应该已在 Android Studio 中打开 build-android-start 项目。如果您看到有关 google-services.json 文件缺失的警告,请不要担心。它将在后续步骤中添加。

检查依赖项

在此 Codelab 中,我们已为您添加了所需的所有依赖项,但了解如何将 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

在此 Codelab 中,您将使用 Firebase Emulator Suite 在本地模拟 Firebase Auth、Realtime Database 和 Cloud Storage。这样,您就可以获得一个安全、快速且免费的本地开发环境来构建应用。

安装 Firebase CLI

首先,您需要安装 Firebase CLI。如果您使用的是 macOS 或 Linux,则可以运行以下 c网址 命令:

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.

在网络浏览器中,转到 http://localhost:4000 以查看 Firebase Emulator Suite 界面:

Emulator Suite 界面首页

在本 Codelab 的其余部分中,让 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,您必须在 Android 项目的 app 文件夹中添加 google-services.json 文件。在本 Codelab 中,我们提供了一个模拟 JSON 文件,可让您连接到 Firebase 模拟器套件。

mock-google-services.json 文件作为 google-services.json 复制到 build-android-start/app 文件夹中:

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

在此 Codelab 的最后一步中,您将学习如何创建真实的 Firebase 项目和 Firebase Android 应用,以便将此模拟 JSON 文件替换为您自己的配置。

运行应用

现在,您已将项目导入 Android Studio 并添加了 Firebase 配置 JSON 文件,接下来就可以首次运行该应用了。

  1. 启动 Android 模拟器。
  2. 在 Android Studio 中,点击工具栏中的 Run 图标 (execute)。

应用应该会在 Android 模拟器上启动。此时,您应当看到一个空白的消息列表,但是无法收发消息。在此 Codelab 的下一步中,您将对用户进行���份验证,以便他们能够使用 Friends Chat。

6. 启用身份验证

此应用将使用 Firebase Realtime Database 来存储所有聊天消息。不过,在添加数据之前,我们应确保应用安全无虞,并且只有经过身份验证的用户才能发布消息。在此步骤中,我们将启用 Firebase Authentication 并配置 Realtime Database 安全规则。

添加基本登录功能

接下来,我们将向应用添加一些基本的 Firebase Authentication 代码,以检测用户并实现登录屏幕。

检查当前用户

首先,将以下实例变量添加到 MainActivity.kt 类:

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

现在,我们来修改 MainActivity,以便在用户打开应用并且未通过身份验证时将其转至登录屏幕。将以下代码添加到将 binding 附加到 View 的后面onCreate() 方法中:

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。此处,我们使用一个简单的 Sign-In 按钮来启动身份验证。在本部分中,您将使用 FirebaseUI 实现登录逻辑。

SignInActivity 类的 // Firebase instance variables 注释下方添加一个 Auth 实例变量:

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

然后,修改 onCreate() 方法,按照与在 MainActivity 中相同的方式初始化 Firebase:

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 界面,然后点击 Authentication(身份验证)标签页以查看第一个登录的用户账号。

7. 阅读消息

在此步骤中,我们将添加读取和显示存储在 Realtime Database 中的消息的功能。

导入示例邮件

  1. 在 Firebase Emulator Suite 界面中,选择 Realtime Database 标签页。
  2. 将代码库的本地副本中的 initial_messages.json 文件拖放到数据查看器中。

现在,数据库的 messages 节点下应该有几条消息。

读取数据

同步邮件

在本部分,我们添加代码,通过以下方式将新添加的消息同步到应用界面:

  • 初始化 Firebase Realtime Database 并添加一个监听器来处理对数据进行的更改。
  • 更新 RecyclerView 适配器,以显示新消息。
  • 使用 MainActivity 类中的其他 Firebase 实例变量添加 Database 实例变量:

MainActivity.kt

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

将 MainActivity 的 onCreate() 方法修改为下面定义的代码,并将其放置在注释 // Initialize Realtime Database and FirebaseRecyclerAdapter 下。此代码会添加 Realtime Database 中的所有现有消息,然后监听 Firebase Realtime Database 中的 messages 路径下的新子条目。它会为每一条消息向界面添加一个新元素:

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 类中,在内部类 MessageViewHolder() 中实现 bind() 方法:

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

我们还需要显示图片消息,因此还需要在内部类 ImageMessageViewHolder() 中实现 bind() 方法:

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 的更新。更新 MainActivity 中的 onPause()onResume() 方法,如下所示:

MainActivity.kt

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

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

测试同步邮件

  1. 点击 Run(运行)图标 execute
  2. 在 Emulator Suite 界面中,返回 Realtime Database 标签页,然后手动添加一条新消息。确认您的 Android 应用是否显示了相应消息:

恭喜,您刚刚将实时数据库添加到您的应用中!

8. 发送消息

实现短信发送

在本部分中,您将为应用用户添加发送短信的功能。下面的代码段会监听发送按钮上的点击事件,使用消息字段的内容创建新的 FriendlyMessage 对象,并将消息推送到数据库。push() 方法会将自动生成的 ID 添加到推送的对象路径中。这些 ID 具有一定顺序,这样可以确保新消息会添加到列表末尾。

MainActivity 类的 onCreate() 方法中更新发送按钮的点击监听器。此代码已位于 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("")
}

实现图片消息发送

在本部分中,您将为应用用户添加发送图片消息的功能。图像消息通过以下步骤创建:

  • 选择图片
  • 处理图片选择
  • 将临时图片消息写入 Realtime Database
  • 开始上传所选图片
  • 上传完成后,将图片消息网址更新为已上传图片的网址

选择图片

如需添加图片,此 Codelab 会使用 Cloud Storage for Firebase。Cloud Storage 是存储应用二进制数据的理想位置。

处理图片选择并写入临时消息

用户选择图片后,系统会启动图片选择 Intent。这已在 onCreate() 方法末尾的代码中实现。完成后,它会调用 MainActivityonImageSelected() 方法。您将使用下面的代码段,向数据库写入一条包含临时图片网址的消息,指明该图片正在上传。

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 中,点击 executeRun 按钮。
  2. 在 Android 模拟器中,输入消息,然后点按“发送”按钮。您会在应用界面和 Firebase Emulator Suite 界面中看到新消息。
  3. 在 Android 模拟器中,点按“+”图片,从您的设备中选择图片。您首先应看到一条包含占位符图像的新消息,在图像上传完成后,会看到选定的图像。您还应在 Emulator Suite 界面中看到新消息,具体而言,在“Realtime Database”标签页中为一个对象,在“Storage”标签页中为一个 blob。

9. 恭喜!

您刚刚使用 Firebase 构建了一个实时聊天应用!

所学内容

  • Firebase Authentication
  • Firebase Realtime Database
  • Cloud Storage for Firebase

接下来,请尝试运用您在此 Codelab 中学到的知识,将 Firebase 添加到您的 Android 应用中!如需详细了解 Firebase,请访问 firebase.google.com

如果您想要了解如何设置实际 Firebase 项目并使用真实 Firebase 资源(而不是演示项目和模拟资源),请继续下一步操作。

注意:即使您设置了真实的 Firebase 项目,并且尤其是在开始构建真实应用时,我们也建议您使用 Firebase Local Emulator Suite 进行开发和测试。

10. 可选:创建和设置 Firebase 项目

在此步骤中,您将创建一个真实的 Firebase 项目和一个用于此 Codelab 的 Firebase Android 应用。您还将向应用添加特定于应用的 Firebase 配置。最后,您将设置要与应用搭配使用的真实 Firebase 资源。

创建 Firebase 项目

  1. 在浏览器中,转到 Firebase 控制台
  2. 选择添加项目
  3. 选择或输入项目名称。您可以根据需要使用任何名称。
  4. 您无需为此 Codelab 使用 Google Analytics,因此可以跳过为项目启用 Google Analytics 的步骤。
  5. 点击创建项目。 项目���备就绪后,点击继续

升级您的 Firebase 定价方案

如需使用 Cloud Storage for Firebase,您的 Firebase 项目必须采用按需付费 (Blaze) 定价方案,这意味着该项目与一个 Cloud Billing 账号相关联。

  • Cloud Billing 账号要求提供付款方式,例如信用卡。
  • 如果您刚开始接触 Firebase 和 Google Cloud,请确认您是否有资格获得 $300 赠金和 Cloud Billing 免费试用账号
  • 如果您是在某个活动中学习本 Codelab,请向组织者询问是否有 Cloud 抵用金可用。

如需将项目升级到 Blaze 方案,请按以下步骤操作:

  1. 在 Firebase 控制台中,选择升级您的方案
  2. 选择 Blaze 方案。按照屏幕上的说明将 Cloud Billing 账号与您的项目相关联。
    如果您需要在此升级过程中创建 Cloud Billing 账号,则可能需要返回 Firebase 控制台中的升级流程以完成升级。

将 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 控制台,然后按照以下步骤在 Firebase 项目中注册您的 Android 项目:

  1. 在新项目的概览屏幕中,点击 Android 图标以启动设置工作流:添加 Android 应用
  2. 在下一个屏幕上,输入 com.google.firebase.codelab.friendlychat 作为应用的软件包名称。
  3. 点击注册应用,然后点击下载 google-services.json 以下载 Firebase 配置文件。
  4. google-services.json 文件复制到 Android 项目的 app 目录中。
  5. 跳过控制台设置工作流中显示的后续步骤(这些步骤已在 build-android-start 项目中为您完成)。
  6. 将项目与 Gradle 文件同步,确保您的应用拥有所有依赖项。从 Android Studio 工具栏中,依次选择 File > Sync Project with Gradle Files。您可能还需要运行 Build/Clean ProjectBuild/Rebuild Project 才能使配置更改生效。

配置 Firebase Authentication

您需要先启用 Firebase Authentication 以及想要在应用中使用的登录提供方,这样您的应用才能代表用户访问 Firebase Authentication API。

  1. Firebase 控制台中,从左侧导航面板选择 Authentication
  2. 选择登录方法标签页。
  3. 点击电子邮件地址/密码,然后将开关切换为“已启用”(蓝色)。
  4. 点击 Google,然后将开关切换为“已启用”(蓝色),并设置项目支持电子邮件地址。

如果您在此 Codelab 的后面遇到显示“CONFIGURATION_NOT_FOUND”消息的错误,请返回到这一步并仔细检查您的操作。

设置 Realtime Database

此 Codelab 中的应用会将聊天消息存储在 Firebase Realtime Database 中。在本部分中,我们将创建一个数据库,并通过名为 Firebase 安全规则的 JSON 配置语言配置其安全性。

  1. 在 Firebase 控制台的左侧面板中,展开 Build,然后选择 Realtime Database
  2. 点击创建数据库
  3. 为数据库选择一个位置,然后点击下一步
    对于真实应用,您需要选择靠近用户的位置。
  4. 点击以测试模式启动。阅读有关安全规则的免责声明。
    在本 Codelab 的后续步骤中,您将添加安全规则来保护您的数据。在没有为数据库添加安全规则的情况下,请不要公开分发或公开应用。
  5. 点击创建
  6. 创建数据库实例后,选择规则标签页,然后使用以下内容更新规则配置:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

如需详细了解安全规则的工作原理(包括有关“auth”变量的文档),请参阅实时数据库安全文档

设置 Cloud Storage for Firebase

  1. 在 Firebase 控制台的左侧面板中,展开构建,然后选择存储
  2. 点击开始使用
  3. 为默认的 Storage 存储桶选择位置。
    US-WEST1US-CENTRAL1US-EAST1 中的存储桶可以使用 Google Cloud Storage 的“始终免费”层级。所有其他位置的存储桶均遵循 Google Cloud Storage 价格和使用量
  4. 点击以测试模式启动。阅读有关安全规则的免责声明。
    在本 Codelab 的后面部分,您将添加安全规则来保护您的数据。在未为您的存储桶添加安全规则的情况下,请不要公开分发或公开应用。
  5. 点击创建

连接到 Firebase 资源

在此 Codelab 的早期步骤中,您已向 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.DEBUGfalse