Firebase Android Codelab - 建立友好的聊天

截屏

圖片:工作友好的聊天應用程序。

歡迎來到友好聊天代碼實驗室。在此 Codelab 中,您將學習如何使用 Firebase 平台在 Android 上創建聊天應用。

你會學到什麼

  • 如何使用 Firebase 身份驗證來允許用戶登錄。
  • 如何使用 Firebase 實時數據庫同步數據。
  • 如何在 Cloud Storage for Firebase 中存儲二進製文件。
  • 如何使用 Firebase 本地模擬器套件通過 Firebase 開發 Android 應用。

你需要什麼

  • Android Studio中4.2以上版本。
  • 一個Android模擬器與Android 5.0以上版本。
  • Java 7 或更高版本。安裝Java使用這些指令;檢查您的版本,運行java -version
  • 熟悉 Kotlin 編程語言。

克隆存儲庫

從命令行克隆 GitHub 存儲庫:

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

導入到 Android Studio

在Android Studio中,選擇文件>打開,然後選擇build-android-start目錄( android_studio_folder ) 來自您下載示例代碼的目錄。

您現在應該有build-android-start項目Android Studio中打開。如果你看到一個關於警告google-services.json文件丟失,也不用擔心。將在後面的步驟中添加。

檢查依賴項

在此代碼實驗室中,您需要的所有依賴項都已為您添加,但了解如何將 Firebase SDK 添加到您的應用程序很重要:

構建.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'
}

為了運行火力地堡仿真器套件,您需要安裝和使用火力地堡CLI

安裝 CLI

選項 1 - 使用 npm 安裝

如果您的機器上已經安裝了 Node.js 和 npm,您可以使用以下命令安裝 CLI:

npm install -g firebase-tools@latest

選項 2 - 安裝獨立二進製文件

如果你沒有的Node.js / NPM或者你是新的應用程序開發,您可以安裝CLI如下的一個獨立的二進制為您的平台說明這裡

檢查安裝

一旦你安裝了火力地堡CLI,運行以下命令,以確保您有版本9.11.0或更高版本:

firebase --version

啟動模擬器

在你的終端,從當地的根目錄中運行以下命令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://本地主機:4000在Web瀏覽器中查看火力地堡模擬器套房UI:

模擬器套件 UI 主頁

離開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)
}

添加 google-services.json

為了讓你的Android應用程序連接到火力地堡,你必須添加一個google-services.json內部文件app的Android項目的文件夾中。出於本 Codelab 的目的,我們提供了一個模擬 JSON 文件,可讓您連接到 Firebase 模擬器套件。

複製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. 啟動你的安卓模擬器。
  2. 在Android Studio中,單擊運行執行 ) 在工具欄中。

該應用程序應在您的 Android 模擬器上啟動。此時,您應該看到一個空的消息列表,並且無法發送和接收消息。在此代碼實驗室的下一步中,您將對用戶進行身份驗證,以便他們可以使用友好聊天。

此應用將使用 Firebase 實時數據庫來存儲所有聊天消息。但是,在我們添加數據之前,我們應該確保應用程序是安全的,並且只有經過身份驗證的用戶才能發布消息。在這一步中,我們將啟用 Firebase 身份驗證並配置實時數據庫安全規則。

添加基本​​登錄功能

接下來,我們將向應用添加一些基本的 Firebase 身份驗證代碼,以檢測用戶並實現登錄屏幕。

檢查當前用戶

首先將以下實例變量添加到MainActivity.kt類:

主活動.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

現在讓我們修改MainActivity用戶發送到登錄屏幕,每當他們打開該應用,是未經驗證。以下添加到onCreate()方法的binding附著到視圖:

主活動.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()

主活動.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()方法返回有關當前認證的火力地堡用戶的相應信息:

主活動.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()方法來處理登出按鈕:

主活動.kt

private fun signOut() {
    AuthUI.getInstance().signOut()
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
}

現在,我們已具備在必要時將用戶發送到登錄屏幕的所有邏輯。接下來,我們需要實現登錄屏幕以正確驗證用戶。

實現登錄屏幕

打開文件SignInActivity.kt 。這裡使用一個簡單的登錄按鈕來啟動身份驗證。在本節中,您將使用 FirebaseUI 來實現登錄邏輯。

在添加驗證實例變量SignInActivity下類// Firebase instance variables評論:

登錄活動.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

然後,編輯onCreate()方法中,你在做同樣的方式初始化火力地堡MainActivity

登錄活動.kt

// Initialize FirebaseAuth
auth = Firebase.auth

在加入ActivityResultLauncherSignInActivity

登錄活動.kt

// ADD THIS
private val signIn: ActivityResultLauncher<Intent> =
        registerForActivityResult(FirebaseAuthUIActivityResultContract(), this::onSignInResult)

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
}

接著,編輯onStart()方法開球的FirebaseUI標誌在流:

登錄活動.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

登錄活動.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 模擬器上運行該應用程序。您應該立即被發送到登錄屏幕。點擊登錄與電子郵件按鈕,然後創建一個帳戶。如果一切都正確實施,您應該被發送到消息屏幕。

登錄後,在瀏覽器中打開火力地堡模擬器套房UI,然後單擊身份驗證選項卡,看看這第一個登入的用戶帳戶。

在此步驟中,我們將添加讀取和顯示存儲在實時數據庫中的消息的功能。

導入示例消息

  1. 在火力地堡模擬器套房UI,選擇實時數據庫選項卡。
  2. 拖放initial_messages.json從本地的代碼實驗室資源庫的副本文件下載到數據瀏覽器。

你現在應該有下幾個郵件messages數據庫的節點。

讀取數據

同步消息

在本節中,我們添加了通過以下方式將新添加的消息同步到應用程序 UI 的代碼:

  • 初始化 Firebase 實時數據庫並添加一個偵聽器來處理對數據所做的更改。
  • 更新RecyclerView適配器,使新的信息將被顯示。
  • 與添加在你的其他火力地堡的實例變量的數據庫實例變量MainActivity類:

主活動.kt

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

修改您的MainActivity的onCreate()在註釋方法// Initialize Realtime Database and FirebaseRecyclerAdapter下面定義的代碼。此代碼將從實時數據庫的所有現有的郵件,然後偵聽下新的子項messages在你的火力地堡實時數據庫路徑。它為每條消息向 UI 添加一個新元素:

主活動.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()

友好消息適配器.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()

友好消息適配器.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 ,啟動和停止監聽從火力地堡實時數據庫的更新。更新onPause()onResume()的方法MainActivity如下所示:

主活動.kt

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

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

測試同步消息

  1. 單擊運行執行 )。
  2. 在模擬器套房UI,返回到實時數據庫選項卡,然後手動添加一個新的消息。確認消息顯示在您的 Android 應用中:

恭喜,您剛剛為您的應用添加了一個實時數據庫!

實現短信發送

在本節中,您將添加應用程序用戶發送文本消息的功能。下面偵聽發送按鈕點擊事件的代碼片段,創建一個新的FriendlyMessage與消息字段的內容對象,並推動信息到數據庫中。所述push()方法增加了一個自動生成的ID到推對象的路徑。這些 ID 是連續的,以確保將新消息添加到列表的末尾。

更新的發送按鈕的點擊監聽器onCreate()的方法MainActivity類。這個代碼是在底部onCreate()已經方法。更新onClick()的身體,以配合下面的代碼:

主活動.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

選擇圖像

為了添加圖像,此代碼實驗室使用 Cloud Storage for Firebase。 Cloud Storage 是存儲應用程序二進制數據的好地方。

處理圖像選擇和寫入臨時消息

一旦用戶已經選擇的圖像,圖像選擇Intent被啟動。這是已經在代碼在的端部實現onCreate()方法。當完成它調用MainActivityonImageSelected()方法。使用下面的代碼片段,您將向數據庫寫入一條帶有臨時圖像 url 的消息,指示正在上傳圖像。

主活動.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()啟動所選擇的圖像的上傳。上傳完成後,您將更新消息以使用適當的圖像。

主活動.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 模擬器中,輸入一條消息,然後點擊發送按鈕。新消息應該在應用 UI 和 Firebase Emulator Suite UI 中可見。
  3. 在 Android 模擬器中,點擊“+”圖像以從您的設備中選擇圖像。新消息應首先顯示佔位符圖像,然後在圖像上傳完成後顯示所選圖像。新消息也應該在 Emulator Suite UI 中可見,特別是作為實時數據庫選項卡中的對象和存儲選項卡中的 blob。

您剛剛使用 Firebase 構建了一個實時聊天應用程序!

你學到了什麼

  • Firebase 身份驗證
  • Firebase 實時數據庫
  • Firebase 雲存儲

接下來,嘗試使用您在此 Codelab 中學到的知識將 Firebase 添加到您自己的 Android 應用中!要了解更多關於火力地堡,請訪問firebase.google.com

如果您想了解如何建立一個真正的火力地堡項目和使用真正的火力地堡資源(而不是一個示範項目,模擬資源),繼續下一步。

注:即使在您設置了一個真實的火力地堡項目,尤其是當你開始構建一個真正的應用程序,我們建議使用火力地堡本地仿真器套件用於開發和測試。

在這一步中,您將創建一個真實的 Firebase 項目和一個 Firebase Android 應用以用於此 Codelab。您還將向您的應用添加特定於應用的 Firebase 配置。最後,您將設置真實的 Firebase 資源以與您的應用一起使用。

創建 Firebase 項目

  1. 在瀏覽器中,進入火力地堡控制台
  2. 選擇添加項目
  3. 選擇或輸入項目名稱。您可以使用任何您想要的名稱。
  4. 您不需要為此 Codelab 使用 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. 點擊註冊應用程序,然後點擊下載谷歌,services.json下載您的火力地堡的配置文件。
  4. 複製google-services.json文件到app的Android項目的目錄。
  5. 跳過在控制台的設置工作流程顯示的下一步驟(他們已經被你在完成build-android-start項目)。
  6. 通過將您的項目與 Gradle 文件同步,確保您的應用程序可以使用所有依賴項。從Android Studio的工具欄中,選擇文件>同步工程與搖籃文件

配置 Firebase 身份驗證

在您的應用可以代表您的用戶訪問 Firebase 身份驗證 API 之前,您需要啟用 Firebase 身份驗證以及要在應用中使用的登錄提供程序。

  1. 火力地堡控制台,從左側導航面板選擇認證
  2. 選擇登錄方法選項卡。
  3. 單擊電子郵件/密碼,然後撥動開關,以啟用(藍色)。
  4. 點擊谷歌,然後撥動開關來開啟(藍色),並設置一個項目支持電子郵件。

如果您稍後在此 Codelab 中收到錯誤消息“CONFIGURATION_NOT_FOUND”,請返回此步驟並仔細檢查您的工作。

配置實時數據庫

此 Codelab 中的應用將聊天消息存儲在 Firebase 實時數據庫中。在本節中,我們將創建一個數據庫並通過稱為 Firebase 安全規則的 JSON 配置語言配置其安全性。

  1. 火力地堡控制台,從左側導航面板中選擇實時數據庫
  2. 單擊創建數據庫創建一個新的實時數據庫實例。當出現提示時,選擇us-central1區域,然後單擊下一步
  3. 當提示安全規則,選擇鎖定模式,然後單擊啟用
  4. 一旦數據庫實例被創建,選擇規則標籤,然後更新下面的規則配置:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

有關如何安全規則的工作(包括在“身份驗證”可變文檔)的更多信息,請參閱實時數據庫的安全性文檔

為 Firebase 配置 Cloud Storage

  1. 火力地堡控制台,從左側導航面板中選擇存儲
  2. 點擊開始使用,使雲存儲為您的項目。
  3. 按照對話框中的步驟使用建議的默認值設置您的存儲桶。

連接到 Firebase 資源

在本程式碼實驗室的早期步驟中,您添加了以下到MainActivity.kt 。此條件塊將您的 Android 項目連接到 Firebase 模擬器套件。

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

如果您想您的應用程序連接到新的真正的火力地堡的項目和它的真正火力地堡的資源,你可以刪除這個塊或發布模式下運行應用程序,以便BuildConfig.DEBUGfalse