Lớp học lập trình Android Firebase - Xây dựng cuộc trò chuyện thân thiện

1. Khái quát chung

ảnh chụp màn hình

Hình ảnh: Ứng dụng Working Friendly Chat.

Chào mừng bạn đến với lớp học lập trình Trò chuyện thân thiện. Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng nền tảng Firebase để tạo ứng dụng trò chuyện trên Android.

Bạn sẽ học được gì

  • Cách sử dụng Xác thực Firebase để cho phép người dùng đăng nhập.
  • Cách đồng bộ hóa dữ liệu bằng Cơ sở dữ liệu thời gian thực Firebase.
  • Cách lưu trữ tệp nhị phân trong Cloud Storage cho Firebase.
  • Cách sử dụng Bộ mô phỏng cục bộ Firebase để phát triển ứng dụng Android với Firebase.

Những gì bạn cần

  • Phiên bản Android Studio mới nhất.
  • Trình giả lập Android với Android 5.0+.
  • Node.js phiên bản 10 trở lên (để sử dụng Bộ mô phỏng).
  • Java 8 trở lên. Để cài đặt Java, hãy sử dụng các hướng dẫn sau; để kiểm tra phiên bản của bạn, hãy chạy java -version .
  • Làm quen với ngôn ngữ lập trình Kotlin.

2. Lấy mã mẫu

Sao chép kho lưu trữ

Sao chép kho GitHub từ dòng lệnh:

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

Nhập vào Android Studio

Trong Android Studio, chọn File > Open , sau đó chọn thư mục build-android-start ( android_studio_folder ) từ thư mục mà bạn đã tải xuống mã mẫu.

Bây giờ bạn sẽ mở dự án build-android-start trong Android Studio. Nếu bạn thấy cảnh báo về việc thiếu tệp google-services.json , đừng lo lắng. Nó sẽ được thêm vào ở bước sau.

Kiểm tra sự phụ thuộc

Trong lớp học lập trình này, tất cả các phần phụ thuộc bạn cần đều đã được thêm cho bạn, nhưng điều quan trọng là bạn phải hiểu cách thêm SDK Firebase vào ứng dụng của mình:

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. Cài đặt Firebase CLI

Trong lớp học lập trình này, bạn sẽ sử dụng Bộ mô phỏng Firebase để mô phỏng cục bộ Firebase Auth, Cơ sở dữ liệu thời gian thực và Bộ lưu trữ đám mây. Điều này cung cấp môi trường phát triển cục bộ an toàn, nhanh chóng và miễn phí để xây dựng ứng dụng của bạn.

Cài đặt Firebase CLI

Trước tiên, bạn sẽ cần cài đặt Firebase CLI . Nếu bạn đang sử dụng macOS hoặc Linux, bạn có thể chạy lệnh cURL sau:

curl -sL https://firebase.tools | bash

Nếu bạn đang sử dụng Windows, hãy đọc hướng dẫn cài đặt để có tệp nhị phân độc lập hoặc cài đặt qua npm .

Sau khi bạn đã cài đặt CLI, việc chạy firebase --version sẽ báo cáo phiên bản 9.0.0 trở lên:

$ firebase --version
9.0.0

Đăng nhập

Chạy firebase login để kết nối CLI với tài khoản Google của bạn. Thao tác này sẽ mở một cửa sổ trình duyệt mới để hoàn tất quá trình đăng nhập. Đảm bảo chọn cùng một tài khoản bạn đã sử dụng khi tạo dự án Firebase trước đó.

4. Kết nối với Bộ mô phỏng Firebase

Khởi động trình giả lập

Trong thiết bị đầu cuối của bạn, hãy chạy lệnh sau từ thư mục gốc của thư mục codelab-friendlychat-android cục bộ của bạn:

firebase emulators:start --project=demo-friendlychat-android

Bạn sẽ thấy một số nhật ký như thế này. Các giá trị cổng được xác định trong tệp firebase.json , được bao gồm trong mã mẫu được sao chép.

$ 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.

Điều hướng đến http://localhost:4000 trong trình duyệt web của bạn để xem Giao diện người dùng Bộ mô phỏng Firebase:

Trang chủ giao diện người dùng Emulator Suite

Để lệnh emulators:start chạy trong phần còn lại của lớp học lập trình.

Kết nối ứng dụng của bạn

Trong Android Studio, hãy mở MainActivity.kt , sau đó thêm đoạn mã sau vào phương thức 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. Chạy ứng dụng khởi động

Thêm google-services.json

Để ứng dụng Android của bạn kết nối với Firebase, bạn phải thêm tệp google-services.json bên trong thư mục app của dự án Android. Vì mục đích của lớp học lập trình này, chúng tôi đã cung cấp một tệp JSON mô phỏng cho phép bạn kết nối với Bộ mô phỏng Firebase.

Sao chép tệp mock-google-services.json vào thư mục build-android-start/app dưới dạng google-services.json :

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

Ở bước cuối cùng của lớp học lập trình này, bạn sẽ tìm hiểu cách tạo dự án Firebase thực và Ứng dụng Firebase Android để có thể thay thế tệp JSON mô phỏng này bằng cấu hình của riêng bạn.

Chạy ứng dụng

Bây giờ bạn đã nhập dự án vào Android Studio và thêm tệp JSON cấu hình Firebase, bạn đã sẵn sàng chạy ứng dụng lần đầu tiên.

  1. Khởi động Trình giả lập Android của bạn.
  2. Trong Android Studio, nhấp vào Chạy ( hành hình ) trên thanh công cụ.

Ứng dụng sẽ khởi chạy trên Trình mô phỏng Android của bạn. Lúc này, bạn sẽ thấy danh sách tin nhắn trống và việc gửi và nhận tin nhắn sẽ không hoạt động. Trong bước tiếp theo của lớp học lập trình này, bạn sẽ xác thực người dùng để họ có thể sử dụng Trò chuyện thân thiện.

6. Kích hoạt xác thực

Ứng dụng này sẽ sử dụng Cơ sở dữ liệu thời gian thực Firebase để lưu trữ tất cả tin nhắn trò chuyện. Tuy nhiên, trước khi thêm dữ liệu, chúng tôi phải đảm bảo rằng ứng dụng được bảo mật và chỉ những người dùng được xác thực mới có thể đăng tin nhắn. Trong bước này, chúng tôi sẽ kích hoạt Xác thực Firebase và định cấu hình Quy tắc bảo mật cơ sở dữ liệu thời gian thực.

Thêm chức năng đăng nhập cơ bản

Tiếp theo, chúng tôi sẽ thêm một số mã Xác thực Firebase cơ bản vào ứng dụng để phát hiện người dùng và triển khai màn hình đăng nhập.

Kiểm tra người dùng hiện tại

Trước tiên, hãy thêm biến đối tượng sau vào lớp MainActivity.kt :

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Bây giờ, hãy sửa đổi MainActivity để đưa người dùng đến màn hình đăng nhập bất cứ khi nào họ mở ứng dụng và chưa được xác thực. Thêm phần sau vào phương thức onCreate() sau khi binding được gắn vào dạng xem:

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
}

Chúng tôi cũng muốn kiểm tra xem người dùng đã đăng nhập trong 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
    }
}

Sau đó, triển khai các phương thức getUserPhotoUrl()getUserName() để trả về thông tin thích hợp về người dùng Firebase hiện được xác thực:

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
}

Sau đó triển khai phương thức signOut() để xử lý nút đăng xuất:

MainActivity.kt

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

Bây giờ chúng tôi đã có sẵn tất cả logic để đưa người dùng đến màn hình đăng nhập khi cần thiết. Tiếp theo chúng ta cần triển khai màn hình đăng nhập để xác thực người dùng đúng cách.

Triển khai màn hình Đăng nhập

Mở file SignInActivity.kt . Ở đây, nút Đăng nhập đơn giản được sử dụng để bắt đầu xác thực. Trong phần này, bạn sẽ sử dụng FirebaseUI để triển khai logic đăng nhập.

Thêm một biến đối tượng Auth trong lớp SignInActivity trong // Firebase instance variables :

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Sau đó, chỉnh sửa phương thức onCreate() để khởi tạo Firebase giống như cách bạn đã làm trong MainActivity :

SignInActivity.kt

// Initialize FirebaseAuth
auth = Firebase.auth

Thêm trường Hoạt ActivityResultLauncher vào SignInActivity :

SignInActivity.kt

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

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

Tiếp theo, chỉnh sửa phương thức onStart() để bắt đầu luồng đăng nhập 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()
    }
}

Tiếp theo, triển khai phương thức onSignInResult để xử lý kết quả đăng nhập. Nếu kết quả đăng nhập thành công, hãy tiếp tục 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)
        }
    }
}

Đó là nó! Bạn đã triển khai xác thực bằng FirebaseUI chỉ bằng một vài lệnh gọi phương thức và không cần quản lý bất kỳ cấu hình phía máy chủ nào.

Kiểm tra công việc của bạn

Chạy ứng dụng trên Trình mô phỏng Android của bạn. Bạn sẽ ngay lập tức được đưa tới màn hình đăng nhập. Nhấn vào nút Đăng nhập bằng email , sau đó tạo tài khoản. Nếu mọi thứ được triển khai chính xác, bạn sẽ được chuyển đến màn hình nhắn tin.

Sau khi đăng nhập, hãy mở giao diện người dùng Firebase Emulator Suite trong trình duyệt của bạn, sau đó nhấp vào tab Xác thực để xem tài khoản người dùng đã đăng nhập đầu tiên này.

7. Đọc tin nhắn

Trong bước này, chúng tôi sẽ thêm chức năng đọc và hiển thị các tin nhắn được lưu trữ trong Cơ sở dữ liệu thời gian thực.

Nhập tin nhắn mẫu

  1. Trong giao diện người dùng Bộ mô phỏng Firebase, hãy chọn tab Cơ sở dữ liệu thời gian thực .
  2. Kéo và thả tệp initial_messages.json từ bản sao cục bộ của kho lưu trữ lớp học lập trình vào trình xem dữ liệu.

Bây giờ bạn sẽ có một vài tin nhắn trong nút messages của cơ sở dữ liệu.

Đọc dữ liệu

Đồng bộ hóa tin nhắn

Trong phần này, chúng tôi thêm mã đồng bộ hóa các tin nhắn mới được thêm vào giao diện người dùng ứng dụng bằng cách:

  • Đang khởi tạo Cơ sở dữ liệu thời gian thực Firebase và thêm trình nghe để xử lý các thay đổi được thực hiện đối với dữ liệu.
  • Đang cập nhật bộ điều hợp RecyclerView để hiển thị các tin nhắn mới.
  • Thêm các biến đối tượng Cơ sở dữ liệu với các biến đối tượng Firebase khác của bạn trong lớp MainActivity :

MainActivity.kt

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

Sửa đổi phương thức onCreate() của MainActivity trong phần nhận xét // Initialize Realtime Database and FirebaseRecyclerAdapter bằng mã được xác định bên dưới. Mã này thêm tất cả các tin nhắn hiện có từ Cơ sở dữ liệu thời gian thực và sau đó lắng nghe các mục con mới trong đường dẫn messages trong Cơ sở dữ liệu thời gian thực Firebase của bạn. Nó thêm một thành phần mới vào giao diện người dùng cho mỗi tin nhắn:

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

Tiếp theo, trong lớp FriendlyMessageAdapter.kt triển khai phương thức bind() bên trong lớp bên trong MessageViewHolder() :

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

Chúng ta cũng cần hiển thị các thông báo là hình ảnh, do đó, hãy triển khai phương thức bind() trong lớp bên trong ImageMessageViewHolder() :

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

Cuối cùng, quay lại MainActivity , bắt đầu và ngừng nghe các bản cập nhật từ Cơ sở dữ liệu thời gian thực Firebase. Cập nhật các phương thức onPause()onResume() trong MainActivity như dưới đây:

MainActivity.kt

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

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

Kiểm tra việc đồng bộ hóa tin nhắn

  1. Bấm Chạy ( hành hình ).
  2. Trong giao diện người dùng Emulator Suite, hãy quay lại tab Cơ sở dữ liệu thời gian thực , sau đó thêm thông báo mới theo cách thủ công. Xác nhận rằng thông báo hiển thị trong ứng dụng Android của bạn:

Xin chúc mừng, bạn vừa thêm cơ sở dữ liệu thời gian thực vào ứng dụng của mình!

8. Gửi tin nhắn

Thực hiện gửi tin nhắn văn bản

Trong phần này, bạn sẽ thêm khả năng gửi tin nhắn văn bản cho người dùng ứng dụng. Đoạn mã bên dưới lắng nghe các sự kiện nhấp chuột trên nút gửi, tạo một đối tượng FriendlyMessage mới với nội dung của trường tin nhắn và đẩy tin nhắn vào cơ sở dữ liệu. Phương thức push() thêm ID được tạo tự động vào đường dẫn của đối tượng được đẩy. Các ID này mang tính tuần tự để đảm bảo rằng các tin nhắn mới sẽ được thêm vào cuối danh sách.

Cập nhật trình xử lý lượt nhấp của nút gửi trong phương thức onCreate() trong lớp MainActivity . Mã này nằm ở cuối phương thức onCreate() rồi. Cập nhật nội dung onClick() để khớp với mã bên dưới:

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("")
}

Thực hiện gửi tin nhắn hình ảnh

Trong phần này, bạn sẽ thêm khả năng cho người dùng ứng dụng gửi tin nhắn hình ảnh. Việc tạo tin nhắn hình ảnh được thực hiện theo các bước sau:

  • Chọn ảnh
  • Xử lý lựa chọn hình ảnh
  • Viết tin nhắn hình ảnh tạm thời vào Cơ sở dữ liệu thời gian thực
  • Bắt đầu tải lên hình ảnh đã chọn
  • Cập nhật URL thông báo hình ảnh thành URL của hình ảnh đã tải lên sau khi quá trình tải lên hoàn tất

Chọn ảnh

Để thêm hình ảnh, lớp học lập trình này sử dụng Cloud Storage cho Firebase. Cloud Storage là nơi tốt để lưu trữ dữ liệu nhị phân của ứng dụng của bạn.

Xử lý lựa chọn hình ảnh và viết tin nhắn tạm thời

Khi người dùng đã chọn một hình ảnh, Intent chọn hình ảnh sẽ được khởi chạy. Điều này đã được triển khai trong mã ở cuối phương thức onCreate() . Khi hoàn tất, nó gọi phương thức onImageSelected() của MainActivity . Sử dụng đoạn mã bên dưới, bạn sẽ viết một thông báo có url hình ảnh tạm thời tới cơ sở dữ liệu cho biết hình ảnh đang được tải lên.

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

Tải lên hình ảnh và cập nhật tin nhắn

Thêm phương thức putImageInStorage() vào MainActivity . Nó được gọi trong onImageSelected() để bắt đầu tải lên hình ảnh đã chọn. Sau khi tải lên hoàn tất, bạn sẽ cập nhật thông báo để sử dụng hình ảnh phù hợp.

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

Kiểm tra việc gửi tin nhắn

  1. Trong Android Studio, nhấp vào hành hình Nút chạy .
  2. Trong Trình mô phỏng Android của bạn, hãy nhập tin nhắn rồi nhấn vào nút gửi. Thông báo mới sẽ hiển thị trong giao diện người dùng ứng dụng và trong giao diện người dùng Bộ mô phỏng Firebase.
  3. Trong Trình mô phỏng Android, hãy nhấn vào hình ảnh "+" để chọn hình ảnh từ thiết bị của bạn. Thông báo mới trước tiên sẽ hiển thị cùng với hình ảnh giữ chỗ, sau đó là hình ảnh đã chọn sau khi quá trình tải hình ảnh lên hoàn tất. Thông báo mới cũng sẽ hiển thị trong giao diện người dùng Emulator Suite, cụ thể là dưới dạng một đối tượng trong tab Cơ sở dữ liệu thời gian thực và dưới dạng một đốm màu trong tab Bộ nhớ.

9. Xin chúc mừng!

Bạn vừa xây dựng một ứng dụng trò chuyện thời gian thực bằng Firebase!

Những gì bạn đã học được

  • Xác thực Firebase
  • Cơ sở dữ liệu thời gian thực của Firebase
  • Bộ nhớ đám mây cho Firebase

Tiếp theo, hãy thử sử dụng những gì bạn đã học trong lớp học lập trình này để thêm Firebase vào ứng dụng Android của riêng bạn! Để tìm hiểu thêm về Firebase, hãy truy cập firebase.google.com .

Nếu bạn muốn tìm hiểu cách thiết lập dự án Firebase thực và sử dụng tài nguyên Firebase thực (thay vì dự án demo và chỉ tài nguyên mô phỏng), hãy tiếp tục sang bước tiếp theo.

Lưu ý: Ngay cả sau khi bạn thiết lập dự án Firebase thực và đặc biệt là khi bạn bắt đầu xây dựng một ứng dụng thực, chúng tôi khuyên bạn nên sử dụng Bộ mô phỏng cục bộ Firebase để phát triển và thử nghiệm.

10. Tùy chọn: Tạo và thiết lập dự án Firebase

Ở bước này, bạn sẽ tạo một dự án Firebase thực và Ứng dụng Firebase Android để sử dụng với lớp học lập trình này. Bạn cũng sẽ thêm cấu hình Firebase dành riêng cho ứng dụng của mình vào ứng dụng của mình. Và cuối cùng, bạn sẽ thiết lập tài nguyên Firebase thực để sử dụng với ứng dụng của mình.

Tạo dự án Firebase

  1. Trong trình duyệt của bạn, hãy truy cập bảng điều khiển Firebase .
  2. Chọn Thêm dự án .
  3. Chọn hoặc nhập tên dự án. Bạn có thể sử dụng bất kỳ tên nào bạn muốn.
  4. Bạn không cần Google Analytics cho lớp học lập trình này nên bạn có thể bỏ qua việc bật Google Analytics cho dự án của mình.
  5. Nhấp vào Tạo dự án . Khi dự án của bạn đã sẵn sàng, hãy nhấp vào Tiếp tục .

Thêm Firebase vào dự án Android của bạn

Trước khi bạn bắt đầu bước này, hãy lấy hàm băm SHA1 của ứng dụng của bạn. Chạy lệnh sau từ thư mục build-android-start cục bộ của bạn để xác định SHA1 của khóa gỡ lỗi:

./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

Bạn sẽ thấy một số kết quả như trên. Dòng quan trọng là hàm băm SHA1 . Nếu bạn không thể tìm thấy hàm băm SHA1 của mình, hãy xem trang này để biết thêm thông tin.

Quay lại bảng điều khiển Firebase và làm theo các bước sau để đăng ký dự án Android với dự án Firebase của bạn:

  1. Từ màn hình tổng quan về dự án mới của bạn, hãy nhấp vào biểu tượng Android để khởi chạy quy trình thiết lập: thêm ứng dụng android
  2. Trên màn hình tiếp theo, nhập com.google.firebase.codelab.friendlychat làm tên gói cho ứng dụng của bạn.
  3. Nhấp vào Đăng ký ứng dụng , sau đó nhấp vào Tải xuống google-services.json để tải xuống tệp cấu hình Firebase của bạn.
  4. Sao chép tệp google-services.json vào thư mục app của dự án Android của bạn.
  5. Bỏ qua các bước tiếp theo được hiển thị trong quy trình thiết lập của bảng điều khiển (các bước này đã được thực hiện cho bạn trong dự án build-android-start ).
  6. Đảm bảo rằng tất cả các phần phụ thuộc đều có sẵn cho ứng dụng của bạn bằng cách đồng bộ hóa dự án của bạn với các tệp Gradle. Từ thanh công cụ của Android Studio, chọn Tệp > Đồng bộ hóa dự án với tệp Gradle . Bạn cũng có thể cần chạy Build/Clean ProjectBuild/Rebuild Project để các thay đổi cấu hình diễn ra.

Định cấu hình xác thực Firebase

Trước khi ứng dụng của bạn có thể thay mặt người dùng truy cập API xác thực Firebase, bạn cần bật Xác thực Firebase và nhà cung cấp dịch vụ đăng nhập mà bạn muốn sử dụng trong ứng dụng của mình.

  1. Trong bảng điều khiển Firebase , chọn Xác thực từ bảng điều hướng bên trái.
  2. Chọn tab Phương thức đăng nhập .
  3. Nhấp vào Email/Mật khẩu , sau đó chuyển nút gạt sang chế độ bật (màu xanh lam).
  4. Nhấp vào Google , sau đó chuyển nút gạt sang chế độ bật (màu xanh) và đặt email hỗ trợ dự án.

Nếu sau này bạn gặp lỗi trong lớp học lập trình này với thông báo "CONFIGUration_NOT_FOUND", hãy quay lại bước này và kiểm tra kỹ công việc của bạn.

Định cấu hình cơ sở dữ liệu thời gian thực

Ứng dụng trong lớp học lập trình này lưu trữ tin nhắn trò chuyện trong Cơ sở dữ liệu thời gian thực Firebase. Trong phần này, chúng tôi sẽ tạo cơ sở dữ liệu và định cấu hình bảo mật thông qua ngôn ngữ cấu hình JSON có tên là Quy tắc bảo mật Firebase.

  1. Trong bảng điều khiển Firebase , chọn Cơ sở dữ liệu thời gian thực từ bảng điều hướng bên trái.
  2. Nhấp vào Tạo cơ sở dữ liệu để tạo phiên bản Cơ sở dữ liệu thời gian thực mới. Khi được nhắc, hãy chọn khu vực us-central1 , sau đó nhấp vào Next .
  3. Khi được nhắc về quy tắc bảo mật, hãy chọn chế độ khóa , sau đó nhấp vào Bật .
  4. Khi phiên bản cơ sở dữ liệu đã được tạo, hãy chọn tab Quy tắc , sau đó cập nhật cấu hình quy tắc như sau:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

Để biết thêm thông tin về cách hoạt động của Quy tắc bảo mật (bao gồm tài liệu về biến "auth"), hãy xem tài liệu bảo mật Cơ sở dữ liệu thời gian thực .

Định cấu hình lưu trữ đám mây cho Firebase

  1. Trong bảng điều khiển Firebase , chọn Bộ nhớ từ bảng điều hướng bên trái.
  2. Nhấp vào Bắt đầu để bật Cloud Storage cho dự án của bạn.
  3. Làm theo các bước trong hộp thoại để thiết lập vùng lưu trữ của bạn bằng cách sử dụng các giá trị mặc định được đề xuất.

Kết nối với tài nguyên Firebase

Ở bước trước của lớp học lập trình này, bạn đã thêm nội dung sau vào MainActivity.kt . Khối điều kiện này đã kết nối dự án Android của bạn với Bộ mô phỏng 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)
}

Nếu bạn muốn kết nối ứng dụng của mình với dự án Firebase thực mới và tài nguyên Firebase thực của nó, bạn có thể xóa khối này hoặc chạy ứng dụng của mình ở chế độ phát hành để BuildConfig.DEBUGfalse .