Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.

Firebase Android Codelab - Xây dựng trò chuyện thân thiện

ảnh chụp màn hình

Hình ảnh: Ứng dụng Trò chuyện Thân thiện Làm việc.

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

Những gì bạn sẽ học

  • 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 của Firebase.
  • Cách lưu trữ tệp nhị phân trong Lưu trữ đám mây cho Firebase.
  • Cách sử dụng Firebase Local Emulator Suite để phát triển ứng dụng Android với Firebase.

Những gì bạn cần

  • Android Studio phiên bản 4.2 trở lên.
  • Một Android Emulator với Android 5.0+.
  • Java 7 trở lên. Để cài đặt Java sử dụng các hướng dẫn ; để kiểm tra phiên bản của bạn, chạy java -version .
  • Làm quen với ngôn ngữ lập trình Kotlin.

Sao chép kho lưu trữ

Sao chép kho lưu trữ 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 build-android-start thư mục ( android_studio_folder ) từ thư mục mà bạn đã tải xuống mã mẫu.

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

Kiểm tra sự phụ thuộc

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

build.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'
    }
}

app / 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'
}

Để chạy các căn cứ hỏa lực Emulator Suite , bạn cần phải cài đặt và sử dụng các căn cứ hỏa lực CLI .

Cài đặt CLI

Tùy chọn 1 - Cài đặt bằng npm

Nếu bạn đã cài đặt Node.js và npm trên máy tính của mình, bạn có thể cài đặt CLI bằng lệnh sau:

npm install -g firebase-tools@latest

Tùy chọn 2 - Cài đặt nhị phân độc lập

Nếu bạn không có Node.js / NPM hoặc bạn là người mới để phát triển ứng dụng, bạn có thể cài đặt CLI như một nhị phân độc lập sau khi hướng dẫn cho nền tảng của mình tại đây .

Kiểm tra cài đặt

Một khi bạn có các căn cứ hỏa lực CLI cài đặt, hãy chạy lệnh sau đây để chắc chắn rằng bạn có phiên bản 9.11.0 trở lên:

firebase --version

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

Trong terminal của bạn, hãy chạy lệnh sau đây từ thư mục gốc của địa phương của bạn codelab-friendlychat-android thư mục:

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

Bạn sẽ thấy một số bản ghi như thế này. Các giá trị cổng được định nghĩa trong firebase.json tập tin, được bao gồm trong mã mẫu nhân bản.

$ 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 các căn cứ hỏa lực Emulator Suite UI:

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

Rời khỏi emulators:start lệnh chạy cho phần còn lại của codelab.

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

Trong Android Studio, mở MainActivity.kt , sau đó thêm đoạn mã sau vào bên trong onCreate phương pháp:

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

Thêm google-services.json

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

Sao chép mock-google-services.json tập tin vào build-android-start/app folder như google-services.json :

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

Trong bước cuối cùng của chương trình codelab này, bạn sẽ học cách tạo một dự án Firebase thực và Ứng dụng Android Firebase để bạn có thể thay thế tệp JSON giả 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, bấm Chạy (hành hình ) trên thanh công cụ.

Ứng dụng sẽ khởi chạy trên Trình giả lập Android của bạn. Tại thời điểm này, bạn sẽ thấy một 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 bảng mã 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.

Ứng dụng này sẽ sử dụng Cơ sở dữ liệu thời gian thực của Firebase để lưu trữ tất cả các tin nhắn trò chuyện. Tuy nhiên, trước khi thêm dữ liệu, chúng ta nên đả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ẽ bậ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

Đầu tiên thêm biến Ví dụ sau đây cho MainActivity.kt lớp:

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Bây giờ chúng ta hãy sửa đổi MainActivity để gửi người dùng đến màn hình đăng nhập bất cứ khi nào họ mở ứng dụng và đang được thẩm định. Thêm sau vào onCreate() phương pháp sau khi binding được gắn vào 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 nếu người dùng đang đă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 đó thực hiện các getUserPhotoUrl()getUserName() phương pháp để trả lại thông tin thích hợp về sử dụng căn cứ hỏa lực hiện chứng 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 đó thực hiện các signOut() phương pháp để xử lý các dấu hiệu nút ra:

MainActivity.kt

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

Bây giờ chúng ta có 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 một cách chính xác.

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

Mở tập tin SignInActivity.kt . Ở đây, một 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 Ví dụ Auth trong SignInActivity lớp dưới // Firebase instance variables bình luận:

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Sau đó, chỉnh sửa các onCreate() phương pháp để khởi tạo căn cứ hỏa lực trong cùng một cách bạn đã làm trong MainActivity :

SignInActivity.kt

// Initialize FirebaseAuth
auth = Firebase.auth

Thêm một ActivityResultLauncher trường để 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 các onStart() phương pháp để khởi động dấu FirebaseUI trong dòng chảy:

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, thực hiện onSignInResult phương pháp để xử lý các dấu hiệu trong kết quả. Nếu kết quả của các lần đăng nhập thành công, 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 với FirebaseUI chỉ trong 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 giả lập Android của bạn. Bạn sẽ ngay lập tức được đưa đến màn hình đăng nhập. Bấm vào nút Đăng nhập bằng email, sau đó tạo một 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, mở căn cứ hỏa lực Emulator Suite UI trong trình duyệt của bạn, sau đó nhấp vào tab Authentication để thấy điều này đầu tiên đăng nhập tài khoản người dùng.

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

Nhập tin nhắn mẫu

  1. Trong căn cứ hỏa lực Emulator Suite UI, chọn tab Cơ sở dữ liệu thời gian thực.
  2. Kéo và thả các initial_messages.json tập tin từ bản sao cục bộ của kho codelab vào xem dữ liệu.

Bây giờ bạn sẽ có một vài thông điệp dưới messages nút 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:

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

MainActivity.kt

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

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

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 FriendlyMessageAdapter.kt lớp thực hiện bind() phương pháp trong lớp bên 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ị tin nhắn đó là những hình ảnh, vì vậy cũng thực hiện bind() phương pháp trong lớp bên 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, trở lại trong MainActivity , bắt đầu và dừng lại lắng nghe các bản cập nhật từ Cơ sở dữ liệu căn cứ hỏa lực Realtime. Cập nhật onPause()onResume() phương pháp trong MainActivity như hì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 đồng bộ hóa tin nhắn

  1. Bấm Chạy (hành hình ).
  2. Trong Emulator Suite UI, quay trở lại tab Cơ sở dữ liệu thời gian thực, sau đó tự thêm một tin nhắn mới. 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 một cơ sở dữ liệu thời gian thực vào ứng dụng của mình!

Triển khai 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ã dưới đây lắng nghe cho sự kiện click vào nút gửi, tạo ra một mới FriendlyMessage đối tượng với các nội dung của trường tin nhắn, và đẩy các thông điệp tới cơ sở dữ liệu. Các push() phương pháp thêm một ID tự động tạo ra để con đường đối tượng đẩy của. Các ID này là tuần tự đảm bảo rằng các thư mới sẽ được thêm vào cuối danh sách.

Cập nhật các thính giả bấm vào nút gửi trong onCreate() phương pháp trong MainActivity lớp. Mã này là ở dưới cùng của onCreate() phương pháp rồi. Cập nhật onClick() cơ thể để phù hợp với đoạn mã sau:

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

Triển khai gửi tin nhắn hình ảnh

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

  • Chọn ảnh
  • Xử lý lựa chọn hình ảnh
  • Viết thông báo 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 tải lên hoàn tất

Chọn ảnh

Để thêm hình ảnh, bảng mã này sử dụng Cloud Storage cho Firebase. Cloud Storage là một 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

Một khi người dùng đã chọn một hình ảnh, việc lựa chọn hình ảnh Intent được đưa ra. Điều này đã được thực hiện trong các mã ở phần cuối của các onCreate() phương pháp. Khi hoàn tất nó gọi là MainActivity 's onImageSelected() phương pháp. 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 vào 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 thông báo

Thêm phương pháp putImageInStorage() để MainActivity . Nó được gọi là trong onImageSelected() để bắt đầu upload các hình ảnh được 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 thích 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 gửi tin nhắn

  1. Trong Android Studio, hãy nhấp vàohành hình Run nút.
  2. Trong Trình giả lập Android của bạn, nhập tin nhắn, sau đó 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 giả lập 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 sẽ hiển thị trước tiên với hình ảnh giữ chỗ, sau đó với hình ảnh đã chọn sau khi quá trình tải lên hình ảnh hoàn tất. Thông báo mới cũng sẽ hiển thị trong Giao diện người dùng Bộ giả lập, 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 Lưu trữ.

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

Những gì bạn đã họ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 được trong bảng mã này để thêm Firebase vào ứng dụng Android của riêng bạn! Để tìm hiểu thêm về căn cứ hỏa lực, hãy truy cập firebase.google.com .

Nếu bạn muốn tìm hiểu làm thế nào để thiết lập một dự án căn cứ hỏa lực thực tế và sử dụng tài nguyên căn cứ hỏa lực thực tế (thay vì một dự án trình diễn và các nguồn lực chỉ mô phỏng), tiếp tục sang bước tiếp theo.

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

Trong bước này, bạn sẽ tạo một dự án Firebase thực và một Ứng dụng Android Firebase để sử dụng với mã hóa này. Bạn cũng sẽ thêm cấu hình Firebase dành riêng cho ứng dụng 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, đi đến căn cứ hỏa lực console .
  2. Chọn Add 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 bảng mã này, vì vậy bạn có thể bỏ qua việc bật nó 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, nhấn Continue.

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 tải hàm băm SHA1 cho ứng dụng của bạn. Chạy lệnh sau từ địa phương của bạn build-android-start thư mục để xác định SHA1 của chính debug của bạn:

./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ố đầu ra như trên. Điểm mấu quan trọng là SHA1 băm. Nếu bạn không thể tìm thấy băm SHA1 bạn, 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 của 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 như tên gói cho ứng dụng của bạn.
  3. Nhấn vào Register App, sau đó nhấn nút Download google-services.json tải tập tin cấu hình căn cứ hỏa lực của bạn.
  4. Sao chép google-services.json tập tin vào app thư mục của dự án Android của bạn.
  5. Bỏ qua các bước tiếp theo thể hiện trong công việc cài đặt của giao diện điều khiển (họ đã được thực hiện cho bạn trong build-android-start dự án).
  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ụ Android Studio, chọn File> Project với Gradle tập tin Sync.

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

Trước khi ứng dụng của bạn có thể truy cập API xác thực Firebase thay mặt cho người dùng, bạn cần bật Xác thực Firebase và các 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 căn cứ hỏa lực console , chọn xác thực từ phía bên trái bảng điều hướng.
  2. Chọn Đăng trong tab phương pháp.
  3. Nhấp vào Email / Password, sau đó bật tắt công tắc để kích hoạt (màu xanh).
  4. Nhấp vào Google, sau đó bật tắt công tắc để kích hoạt (màu xanh) và thiết lập một email hỗ trợ dự án.

Nếu bạn gặp lỗi sau đó trong bảng mã 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 bảng mã này lưu trữ tin nhắn trò chuyện trong Cơ sở dữ liệu thời gian thực của 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 của nó thông qua ngôn ngữ cấu hình JSON được gọi là Quy tắc bảo mật Firebase.

  1. Trong căn cứ hỏa lực console , chọn cơ sở dữ liệu thời gian thực từ bên trái bảng điều hướng.
  2. Nhấn Create Database để tạo ra một cơ sở dữ liệu Ví dụ Realtime mới. Khi được nhắc, chọn us-central1 khu vực, sau đó nhấn Next.
  3. Khi được nhắc về quy tắc bảo mật, chọn chế độ khóa, sau đó nhấp vào Enable.
  4. Khi database instance đã được tạo ra, chọn tab Rules, 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 Security Rules công việc (bao gồm cả tài liệu về biến "auth"), xem các tài liệu an ninh cơ sở dữ liệu thời gian thực .

Định cấu hình bộ nhớ đám mây cho Firebase

  1. Trong căn cứ hỏa lực console , chọn lưu trữ từ bên trái bảng điều hướng.
  2. Bấm Bắt đầu để cho phép 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 nhóm của bạn, sử dụng các giá trị mặc định được đề xuất.

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

Trong một bước trước của codelab này, bạn thêm vào phần sau đây để MainActivity.kt . Khối có điều kiện này đã kết nối dự án Android của bạn với Bộ trình 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 bạn để dự án căn cứ hỏa lực sản mới của bạn và các nguồn lực căn cứ hỏa lực thực sự của nó, bạn có thể loại bỏ khối này hoặc chạy ứng dụng của bạn trong chế độ phát hành để BuildConfig.DEBUGfalse .