Firebase Android Codelab - ایجاد چت دوستانه

۱. مرور کلی

تصویر صفحه

تصویر: برنامه چت دوستانه در حال کار.

به آزمایشگاه کدنویسی چت دوستانه خوش آمدید. در این آزمایشگاه کدنویسی، نحوه استفاده از پلتفرم Firebase برای ایجاد یک برنامه چت در اندروید را خواهید آموخت.

آنچه یاد خواهید گرفت

  • نحوه استفاده از احراز هویت Firebase برای اجازه ورود به کاربران.
  • نحوه همگام‌سازی داده‌ها با استفاده از پایگاه داده بلادرنگ Firebase.
  • نحوه ذخیره فایل‌های باینری در فضای ذخیره‌سازی ابری برای فایربیس.
  • نحوه استفاده از مجموعه شبیه‌ساز محلی Firebase برای توسعه یک برنامه اندروید با Firebase.

آنچه نیاز دارید

  • آخرین نسخه اندروید استودیو
  • یک شبیه‌ساز اندروید با اندروید ۵.۰+.
  • Node.js نسخه ۱۰ یا بالاتر (برای استفاده از مجموعه شبیه‌ساز).
  • جاوا ۸ یا بالاتر. برای نصب جاوا از این دستورالعمل‌ها استفاده کنید؛ برای بررسی نسخه خود، java -version را اجرا کنید.
  • آشنایی با زبان برنامه نویسی کاتلین.

۲. کد نمونه را دریافت کنید

مخزن را کلون کنید

مخزن گیت‌هاب را از خط فرمان کلون کنید:

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

وارد کردن به اندروید استودیو

در اندروید استودیو، File > Open را انتخاب کنید، سپس پوشه build-android-start ( پوشه android_studio ) از دایرکتوری که کد نمونه را دانلود کرده‌اید.

اکنون باید پروژه build-android-start را در اندروید استودیو باز داشته باشید. اگر هشداری در مورد فقدان فایل google-services.json مشاهده کردید، نگران نباشید. این فایل در مرحله بعدی اضافه خواهد شد.

وابستگی‌ها را بررسی کنید

در این آزمایشگاه کد، تمام وابستگی‌های مورد نیاز شما از قبل اضافه شده‌اند، اما مهم است که بدانید چگونه Firebase SDK را به برنامه خود اضافه کنید:

ساخت.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")
}

۳. رابط خط فرمان فایربیس را نصب کنید

در این آزمایشگاه کد، شما از مجموعه شبیه‌ساز Firebase برای شبیه‌سازی محلی Firebase Auth، پایگاه داده بلادرنگ و فضای ذخیره‌سازی ابری استفاده خواهید کرد. این یک محیط توسعه محلی امن، سریع و بدون هزینه برای ساخت برنامه شما فراهم می‌کند.

نصب رابط خط فرمان فایربیس

ابتدا باید Firebase CLI را نصب کنید. اگر از macOS یا Linux استفاده می‌کنید، می‌توانید دستور cURL زیر را اجرا کنید:

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

اگر از ویندوز استفاده می‌کنید، دستورالعمل‌های نصب را برای دریافت یک فایل باینری مستقل یا نصب از طریق npm مطالعه کنید.

پس از نصب رابط خط فرمان (CLI)، اجرای دستور firebase --version باید نسخه 9.0.0 یا بالاتر را گزارش دهد:

$ firebase --version
9.0.0

ورود

برای اتصال رابط خط فرمان (CLI) به حساب گوگل خود، firebase login اجرا کنید. این کار یک پنجره مرورگر جدید برای تکمیل فرآیند ورود به سیستم باز می‌کند. حتماً همان حسابی را که قبلاً هنگام ایجاد پروژه Firebase خود استفاده کرده‌اید، انتخاب کنید.

۴. به مجموعه شبیه‌ساز Firebase متصل شوید

شبیه‌سازها را شروع کنید

در ترمینال خود، دستور زیر را از ریشه دایرکتوری محلی 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.

برای مشاهده رابط کاربری Firebase Emulator Suite، در مرورگر وب خود به آدرس http://localhost:4000 بروید:

رابط کاربری مجموعه شبیه‌ساز - صفحه اصلی

دستور emulators:start در ادامه‌ی کدلب در حال اجرا بگذارید.

برنامه خود را وصل کنید

در اندروید استودیو، 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 را اضافه کنید

برای اینکه برنامه اندروید شما به Firebase متصل شود، باید یک فایل google-services.json را در پوشه app پروژه اندروید خود اضافه کنید. برای اهداف این آزمایشگاه کد، ما یک فایل JSON شبیه‌سازی شده ارائه داده‌ایم که به شما امکان می‌دهد به Firebase Emulator Suite متصل شوید.

فایل mock-google-services.json را با نام google-services.json در پوشه build-android-start/app کپی کنید:

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

در مرحله آخر این آزمایشگاه کد، یاد خواهید گرفت که چگونه یک پروژه واقعی Firebase و برنامه اندروید Firebase ایجاد کنید تا بتوانید این فایل JSON ساختگی را با پیکربندی خودتان جایگزین کنید.

برنامه را اجرا کنید

حالا که پروژه را به اندروید استودیو وارد کرده‌اید و یک فایل JSON پیکربندی فایربیس اضافه کرده‌اید، آماده‌اید تا برنامه را برای اولین بار اجرا کنید.

  1. شبیه‌ساز اندروید خود را اجرا کنید.
  2. در اندروید استودیو، روی اجرا (Run) کلیک کنید. اجرا کردن ) در نوار ابزار.

برنامه باید روی شبیه‌ساز اندروید شما اجرا شود. در این مرحله، باید یک لیست پیام خالی ببینید و ارسال و دریافت پیام‌ها کار نخواهد کرد. در مرحله بعدی این آزمایشگاه کد، کاربران را احراز هویت خواهید کرد تا بتوانند از چت دوستانه استفاده کنند.

۶. فعال کردن احراز هویت

این برنامه از پایگاه داده Realtime Firebase برای ذخیره تمام پیام‌های چت استفاده خواهد کرد. قبل از اضافه کردن داده‌ها، باید مطمئن شویم که برنامه امن است و فقط کاربران احراز هویت شده می‌توانند پیام ارسال کنند. در این مرحله، احراز هویت Firebase را فعال کرده و قوانین امنیتی Realtime Database را پیکربندی می‌کنیم.

افزودن قابلیت ورود اولیه

در مرحله بعد، تعدادی کد احراز هویت Firebase اولیه به برنامه اضافه خواهیم کرد تا کاربران را شناسایی کرده و یک صفحه ورود به سیستم پیاده‌سازی کنیم.

بررسی کاربر فعلی

ابتدا متغیر نمونه زیر را به کلاس MainActivity.kt اضافه کنید:

فعالیت اصلی.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

حالا بیایید MainActivity طوری تغییر دهیم که هر زمان کاربر برنامه را باز می‌کند و احراز هویت نشده است، به صفحه ورود به سیستم هدایت شود. کد زیر را به متد onCreate() پس از binding به view اضافه کنید:

فعالیت اصلی.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() را برای برگرداندن اطلاعات مناسب در مورد کاربر Firebase که در حال حاضر احراز هویت شده است، پیاده‌سازی کنید:

فعالیت اصلی.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 برای پیاده‌سازی منطق ورود استفاده خواهید کرد.

یک متغیر نمونه Auth را در کلاس SignInActivity و زیر کامنت // Firebase instance variables اضافه کنید:

ورود به سیستم

// Firebase instance variables
private lateinit var auth: FirebaseAuth

سپس، متد onCreate() را ویرایش کنید تا Firebase را به همان روشی که در MainActivity انجام دادید، مقداردهی اولیه کنید:

ورود به سیستم

// Initialize FirebaseAuth
auth = Firebase.auth

یک فیلد ActivityResultLauncher به SignInActivity اضافه کنید:

ورود به سیستم

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

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

در مرحله بعد، متد onStart() را ویرایش کنید تا جریان ورود به سیستم FirebaseUI آغاز شود:

ورود به سیستم

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 بروید:

ورود به سیستم

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 تنها با چند فراخوانی متد و بدون نیاز به مدیریت هیچ پیکربندی سمت سروری پیاده‌سازی کرده‌اید.

کار خود را آزمایش کنید

برنامه را روی شبیه‌ساز اندروید خود اجرا کنید. باید بلافاصله به صفحه ورود به سیستم هدایت شوید. روی دکمه ورود با ایمیل ضربه بزنید، سپس یک حساب کاربری ایجاد کنید. اگر همه چیز به درستی اجرا شده باشد، باید به صفحه پیام‌رسانی هدایت شوید.

پس از ورود به سیستم، رابط کاربری Firebase Emulator Suite را در مرورگر خود باز کنید، سپس روی تب Authentication کلیک کنید تا اولین حساب کاربری وارد شده را مشاهده کنید.

۷. خواندن پیام‌ها

در این مرحله، قابلیت خواندن و نمایش پیام‌های ذخیره شده در پایگاه داده Realtime را اضافه خواهیم کرد.

وارد کردن پیام‌های نمونه

  1. در رابط کاربری Firebase Emulator Suite، تب Realtime Database را انتخاب کنید.
  2. فایل initial_messages.json را از کپی محلی مخزن codelab خود به داخل نمایشگر داده بکشید و رها کنید.

اکنون باید چند پیام در زیر گره messages پایگاه داده داشته باشید.

خواندن داده‌ها

همگام‌سازی پیام‌ها

در این بخش کدی اضافه می‌کنیم که پیام‌های تازه اضافه شده را با استفاده از موارد زیر در رابط کاربری برنامه همگام‌سازی می‌کند:

  • مقداردهی اولیه پایگاه داده Firebase Realtime و اضافه کردن یک شنونده برای مدیریت تغییرات ایجاد شده در داده‌ها.
  • آداپتور RecyclerView را به‌روزرسانی کنید تا پیام‌های جدید نمایش داده شوند.
  • اضافه کردن متغیرهای نمونه پایگاه داده به همراه سایر متغیرهای نمونه Firebase در کلاس MainActivity :

فعالیت اصلی.kt

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

متد onCreate() در MainActivity خود را در زیر کامنت // Initialize Realtime Database and FirebaseRecyclerAdapter با کد تعریف شده در زیر تغییر دهید. این کد تمام پیام‌های موجود را از Realtime Database اضافه می‌کند و سپس به ورودی‌های فرزند جدید در زیر مسیر messages در Firebase Realtime Database شما گوش می‌دهد. این کد برای هر پیام یک عنصر جدید به رابط کاربری اضافه می‌کند:

فعالیت اصلی.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() پیاده‌سازی کنید:

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

ما همچنین باید پیام‌هایی را نمایش دهیم که تصویر هستند، بنابراین متد bind() را نیز درون کلاس داخلی 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)
        }
    }
}

در نهایت، به MainActivity برگردید، شروع و پایان گوش دادن به به‌روزرسانی‌ها از Firebase Realtime Database را تعیین کنید. متدهای onPause() و onResume() را در MainActivity مطابق شکل زیر به‌روزرسانی کنید:

فعالیت اصلی.kt

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

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

تست همگام‌سازی پیام‌ها

  1. روی اجرا کلیک کنید ( اجرا کردن ).
  2. در رابط کاربری Emulator Suite، به تب Realtime Database برگردید، سپس به صورت دستی یک پیام جدید اضافه کنید. تأیید کنید که پیام در برنامه اندروید شما نمایش داده می‌شود:

تبریک می‌گویم، شما یک پایگاه داده بلادرنگ به برنامه خود اضافه کردید!

۸. ارسال پیام

پیاده‌سازی ارسال پیامک

در این بخش، قابلیت ارسال پیام‌های متنی را برای کاربران برنامه اضافه خواهید کرد. قطعه کد زیر به رویدادهای کلیک روی دکمه ارسال گوش می‌دهد، یک شیء FriendlyMessage جدید با محتوای فیلد پیام ایجاد می‌کند و پیام را به پایگاه داده ارسال می‌کند. متد push() یک شناسه (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("")
}

پیاده‌سازی ارسال پیام تصویری

در این بخش، قابلیت ارسال پیام‌های تصویری را برای کاربران برنامه اضافه خواهید کرد. ایجاد یک پیام تصویری با این مراحل انجام می‌شود:

  • انتخاب تصویر
  • مدیریت انتخاب تصویر
  • نوشتن پیام تصویر موقت در پایگاه داده بلادرنگ
  • شروع آپلود تصویر انتخاب شده
  • پس از اتمام آپلود، آدرس اینترنتی پیام تصویر را به آدرس اینترنتی تصویر آپلود شده به‌روزرسانی کنید.

انتخاب تصویر

برای افزودن تصاویر، این codelab از فضای ذخیره‌سازی ابری برای Firebase استفاده می‌کند. فضای ذخیره‌سازی ابری مکان خوبی برای ذخیره داده‌های دودویی برنامه شماست.

مدیریت انتخاب تصویر و نوشتن پیام موقت

پس از انتخاب تصویر توسط کاربر، Intent انتخاب تصویر اجرا می‌شود. این مورد در کد انتهای متد onCreate() پیاده‌سازی شده است. پس از اتمام، متد onImageSelected() در 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() فراخوانی می‌شود تا آپلود تصویر انتخاب شده را آغاز کند. پس از اتمام آپلود، پیام را برای استفاده از تصویر مناسب به‌روزرسانی خواهید کرد.

فعالیت اصلی.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. در اندروید استودیو، روی اجرا کردن دکمه اجرا .
  2. در شبیه‌ساز اندروید خود، یک پیام وارد کنید، سپس روی دکمه ارسال ضربه بزنید. پیام جدید باید در رابط کاربری برنامه و در رابط کاربری مجموعه شبیه‌ساز فایربیس قابل مشاهده باشد.
  3. در شبیه‌ساز اندروید، روی تصویر "+" ضربه بزنید تا تصویری از دستگاه خود انتخاب کنید. پیام جدید ابتدا باید با یک تصویر جایگزین قابل مشاهده باشد و سپس پس از اتمام آپلود تصویر، با تصویر انتخاب شده نمایش داده شود. پیام جدید همچنین باید در رابط کاربری مجموعه شبیه‌ساز، به طور خاص به عنوان یک شیء در تب پایگاه داده بلادرنگ و به عنوان یک حباب در تب ذخیره‌سازی قابل مشاهده باشد.

۹. تبریک می‌گویم!

شما به همین راحتی یک برنامه چت بلادرنگ با استفاده از Firebase ساختید!

آنچه آموختید

  • احراز هویت فایربیس
  • پایگاه داده بلادرنگ فایربیس
  • فضای ذخیره‌سازی ابری برای فایربیس

در مرحله بعد، سعی کنید از آنچه در این آزمایشگاه کد یاد گرفتید برای اضافه کردن Firebase به برنامه اندروید خود استفاده کنید! برای کسب اطلاعات بیشتر در مورد Firebase، به firebase.google.com مراجعه کنید.

اگر می‌خواهید یاد بگیرید که چگونه یک پروژه Firebase واقعی راه‌اندازی کنید و از منابع واقعی Firebase استفاده کنید (به جای یک پروژه آزمایشی و فقط منابع شبیه‌سازی شده)، به مرحله بعدی بروید.

توجه: حتی پس از راه‌اندازی یک پروژه واقعی Firebase و به خصوص زمانی که شروع به ساخت یک برنامه واقعی می‌کنید، توصیه می‌کنیم از Firebase Local Emulator Suite برای توسعه و آزمایش استفاده کنید.

۱۰. اختیاری: ایجاد و راه‌اندازی یک پروژه Firebase

در این مرحله، شما یک پروژه Firebase واقعی و یک برنامه اندروید Firebase برای استفاده در این codelab ایجاد خواهید کرد. همچنین پیکربندی Firebase مخصوص برنامه خود را به برنامه خود اضافه خواهید کرد. و در نهایت، منابع واقعی Firebase را برای استفاده در برنامه خود تنظیم خواهید کرد.

ایجاد یک پروژه فایربیس

  1. با استفاده از حساب گوگل خود وارد کنسول فایربیس شوید.
  2. برای ایجاد یک پروژه جدید، روی دکمه کلیک کنید و سپس نام پروژه را وارد کنید (برای مثال، FriendlyChat ).
  3. روی ادامه کلیک کنید.
  4. در صورت درخواست، شرایط Firebase را مرور و قبول کنید و سپس روی ادامه کلیک کنید.
  5. (اختیاری) دستیار هوش مصنوعی را در کنسول Firebase (با نام "Gemini در Firebase") فعال کنید.
  6. برای این codelab، به گوگل آنالیتیکس نیاز ندارید ، بنابراین گزینه گوگل آنالیتیکس را غیرفعال کنید .
  7. روی ایجاد پروژه کلیک کنید، منتظر بمانید تا پروژه شما آماده شود و سپس روی ادامه کلیک کنید.

طرح قیمت‌گذاری فایربیس خود را ارتقا دهید

برای استفاده از فضای ذخیره‌سازی ابری برای فایربیس، پروژه فایربیس شما باید در طرح قیمت‌گذاری پرداخت در محل (Blaze) باشد، به این معنی که به یک حساب پرداخت ابری متصل باشد.

  • یک حساب Cloud Billing به یک روش پرداخت، مانند کارت اعتباری، نیاز دارد.
  • اگر در استفاده از فایربیس و گوگل کلود تازه‌کار هستید، بررسی کنید که آیا واجد شرایط دریافت اعتبار ۳۰۰ دلاری و یک حساب کاربری رایگان ابری هستید یا خیر.
  • اگر این codelab را به عنوان بخشی از یک رویداد انجام می‌دهید، از برگزارکننده خود بپرسید که آیا امکان استفاده از فضای ابری (Cloud credits) وجود دارد یا خیر.

برای ارتقاء پروژه خود به طرح Blaze، مراحل زیر را دنبال کنید:

  1. در کنسول Firebase، گزینه ارتقاء پلن خود را انتخاب کنید.
  2. طرح Blaze را انتخاب کنید. دستورالعمل‌های روی صفحه را دنبال کنید تا یک حساب Cloud Billing به پروژه شما متصل شود.
    اگر به عنوان بخشی از این ارتقا نیاز به ایجاد یک حساب Cloud Billing داشتید، ممکن است لازم باشد برای تکمیل ارتقا، به روند ارتقا در کنسول Firebase برگردید.

فایربیس را به پروژه اندروید خود اضافه کنید

در کنسول Firebase، مراحل زیر را برای ثبت پروژه اندروید خود در پروژه Firebase دنبال کنید:

  1. از صفحه نمای کلی پروژه جدید خود، روی آیکون اندروید کلیک کنید تا گردش کار راه‌اندازی شود: اضافه کردن برنامه اندروید
  2. در صفحه بعد، com.google.firebase.codelab.friendlychat را به عنوان نام بسته برنامه خود وارد کنید.
  3. روی ثبت برنامه کلیک کنید، سپس روی دانلود google-services.json کلیک کنید تا فایل پیکربندی Firebase شما دانلود شود.
  4. فایل google-services.json را در پوشه app پروژه اندروید خود کپی کنید.
  5. مراحل بعدی نشان داده شده در گردش کار راه‌اندازی کنسول را نادیده بگیرید (آنها قبلاً در پروژه build-android-start برای شما انجام شده‌اند).
  6. با همگام‌سازی پروژه خود با فایل‌های Gradle، مطمئن شوید که همه وابستگی‌ها برای برنامه شما در دسترس هستند. از نوار ابزار اندروید استودیو، File > Sync Project with Gradle Files را انتخاب کنید. همچنین ممکن است لازم باشد Build/Clean Project و Build/Rebuild Project را برای اعمال تغییرات پیکربندی اجرا کنید.

پیکربندی احراز هویت فایربیس

قبل از اینکه برنامه شما بتواند از طرف کاربران به APIهای احراز هویت Firebase دسترسی پیدا کند، باید احراز هویت Firebase و ارائه‌دهندگان ورود به سیستمی را که می‌خواهید در برنامه خود استفاده کنید، فعال کنید.

  1. در کنسول Firebase ، از پنل ناوبری سمت چپ، گزینه Authentication را انتخاب کنید.
  2. برگه روش ورود را انتخاب کنید.
  3. روی ایمیل/رمز عبور کلیک کنید، سپس کلید را به حالت فعال (آبی) تغییر دهید.
  4. روی گوگل کلیک کنید، سپس دکمه را روی فعال (آبی) قرار دهید و یک ایمیل پشتیبانی پروژه تنظیم کنید.

اگر بعداً در این آزمایشگاه کد با خطایی با پیام "CONFIGURATION_NOT_FOUND" مواجه شدید، به این مرحله برگردید و کار خود را دوباره بررسی کنید.

ممکن است لازم باشد اثر انگشت SHA برنامه خود را برای استفاده از «ورود با گوگل» مشخص کنید. می‌توانید این کار را در صفحه تنظیمات کنسول Firebase انجام دهید. برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA برنامه خود، به «احراز هویت کلاینت» مراجعه کنید.

راه اندازی پایگاه داده بلادرنگ

برنامه‌ی موجود در این codelab پیام‌های چت را در پایگاه داده‌ی بلادرنگ Firebase ذخیره می‌کند. در این بخش، یک پایگاه داده ایجاد می‌کنیم و امنیت آن را از طریق یک زبان پیکربندی JSON به نام Firebase Security Rules پیکربندی می‌کنیم.

  1. در پنل سمت چپ کنسول Firebase، گزینه Build را باز کرده و سپس Realtime Database را انتخاب کنید.
  2. روی ایجاد پایگاه داده کلیک کنید.
  3. مکانی را برای پایگاه داده خود انتخاب کنید، سپس روی Next کلیک کنید.
    برای یک اپلیکیشن واقعی، شما می‌خواهید مکانی را انتخاب کنید که به کاربرانتان نزدیک باشد.
  4. روی شروع در حالت آزمایشی کلیک کنید. سلب مسئولیت مربوط به قوانین امنیتی را مطالعه کنید.
    در مراحل بعدی این آزمایشگاه کد، شما قوانین امنیتی را برای ایمن‌سازی داده‌های خود اضافه خواهید کرد. بدون اضافه کردن قوانین امنیتی برای پایگاه داده خود، برنامه را به صورت عمومی توزیع یا افشا نکنید .
  5. روی ایجاد کلیک کنید.
  6. پس از ایجاد نمونه پایگاه داده، تب Rules را انتخاب کنید، سپس پیکربندی قوانین را با موارد زیر به‌روزرسانی کنید:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

برای اطلاعات بیشتر در مورد نحوه عملکرد قوانین امنیتی (از جمله مستندات مربوط به متغیر "auth")، به مستندات امنیتی Realtime Database مراجعه کنید.

راه‌اندازی فضای ذخیره‌سازی ابری برای فایربیس

  1. در پنل سمت چپ کنسول Firebase، گزینه Build را باز کرده و سپس Storage را انتخاب کنید.
  2. روی شروع به کار کلیک کنید.
  3. مکانی را برای سطل ذخیره‌سازی پیش‌فرض خود انتخاب کنید.
    کاربران در US-WEST1 ، US-CENTRAL1 و US-EAST1 می‌توانند از ردیف «همیشه رایگان» برای Google Cloud Storage بهره‌مند شوند. کاربران در سایر مناطق ، از قیمت‌ها و میزان استفاده از Google Cloud Storage پیروی می‌کنند.
  4. روی شروع در حالت آزمایشی کلیک کنید. سلب مسئولیت مربوط به قوانین امنیتی را مطالعه کنید.
    بعداً در این آزمایشگاه کد، قوانین امنیتی را برای ایمن‌سازی داده‌های خود اضافه خواهید کرد. بدون اضافه کردن قوانین امنیتی برای مخزن ذخیره‌سازی خود، برنامه را به صورت عمومی توزیع یا در معرض نمایش قرار ندهید .
  5. روی ایجاد کلیک کنید.

اتصال به منابع فایربیس

در مرحله‌ی قبلی این آزمایشگاه کد، کد زیر را به MainActivity.kt اضافه کردید. این بلوک شرطی، پروژه‌ی اندروید شما را به 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.DEBUG روی false شود.