Firebase Android Codelab - 构建友好型聊天

1. 概览

屏幕截图

图片:运行友好的 Chat 应用。

欢迎学习 Free 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 Authentication、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 文件复制到 build-android-start/app 文件夹中,并将其重命名为 google-services.json

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 的下一步中,您将对用户进行身份验证,以便他们能够使用 Relation 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 文件。此处使用一个简单的登录按钮来启动身份验证。在本部分中,您将使用 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

SignInActivity 添加 ActivityResultLauncher 字段:

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 文件从 Codelab 代码库的本地副本拖放到数据查看器中。

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

读取数据

同步邮件

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

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

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() 方法:

FreeMessageAdapter.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() 方法:

FreeMessageAdapter.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. 点击创建项目。 项目准备就绪后,点击 Continue(继续)。

将 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 区域,然后点击 Next
  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