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

1. 概览

屏幕截图

图片:方便使用的 Chat 应用。

欢迎来到 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 Emulator Suite。

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 的下一步中,您将对用户进行身份验证,以便他们可以使用 Friendly 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 附加到视图之后,将以下代码添加到 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 实例变量一起添加:

MainActivity.kt

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

使用下面定义的代码修改 // Initialize Realtime Database and FirebaseRecyclerAdapter 注释下的 MainActivity 的 onCreate() 方法。此代码会添加 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 项目和一个 Firebase Android 应用,以便在此 Codelab 中使用。您还将向应用添加特定于应用的 Firebase 配置。最后,您将设置要与应用搭配使用的真实 Firebase 资源。

创建 Firebase 项目

  1. 在浏览器中,前往 Firebase 控制台
  2. 选择添加项目
  3. 选择或输入项目名称。您可以使用任何名称。
  4. 您无需为此 Codelab 使用 Google Analytics,因此可以跳过为项目启用 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 控制台,按照以下步骤在 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 控制台中,从左侧导航面板中选择身份验证
  2. 选择登录方法标签页。
  3. 点击电子邮件地址/密码,然后将开关切换为“已启用”(蓝色)。
  4. 点击 Google,然后将开关切换为“已启用”(蓝色),并设置项目支持电子邮件地址。

如果您稍后在此 Codelab 中收到错误消息“CONFIGURATION_NOT_FOUND”,请返回此步骤并仔细检查您的操作。

配置 Realtime Database

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

  1. Firebase 控制台中,从左侧导航面板选择 Realtime Database
  2. 点击创建数据库以创建新的 Realtime Database 实例。出现提示时,选择 us-central1 区域,然后点击下一步
  3. 当系统提示您选择安全规则时,选择锁定模式,然后点击启用
  4. 创建数据库实例后,选择规则标签页,然后使用以下内容更新规则配置:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

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

配置 Cloud Storage for Firebase

  1. Firebase 控制台中,从左侧导航面板中选择 Storage
  2. 点击开始,为您的项目启用 Cloud Storage。
  3. 按照对话框中的步骤设置存储桶,并使用建议的默认值。

连接到 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