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 >打开,然后从下载示例代码的目录中选择 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 文件。其中有一个用于发起身份验证的简单登录按钮。在本部分中,您将使用 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

使用下面定义的代码修改 // 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 项目和一个用于此 Codelab 的 Firebase Android 应用。您还需要为应用添加特定于应用的 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 控制台中,从左侧导航面板选择 Authentication
  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”变量的文档),请参阅 Realtime Database 安全文档

配置 Cloud Storage for Firebase

  1. Firebase 控制台中,从左侧导航面板选择存储
  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