फायरबेस एंड्रॉइड कोडेलैब - फ्रेंडली चैट बनाएं

1 अवलोकन

स्क्रीनशॉट

छवि: वर्किंग फ्रेंडली चैट ऐप।

फ्रेंडली चैट कोडलैब में आपका स्वागत है। इस कोडलैब में, आप सीखेंगे कि एंड्रॉइड पर चैट ऐप बनाने के लिए फायरबेस प्लेटफॉर्म का उपयोग कैसे करें।

आप क्या सीखेंगे

  • उपयोगकर्ताओं को साइन इन करने की अनुमति देने के लिए फायरबेस प्रमाणीकरण का उपयोग कैसे करें।
  • फायरबेस रीयलटाइम डेटाबेस का उपयोग करके डेटा को कैसे सिंक करें।
  • फायरबेस के लिए क्लाउड स्टोरेज में बाइनरी फ़ाइलों को कैसे स्टोर करें।
  • फायरबेस के साथ एंड्रॉइड ऐप विकसित करने के लिए फायरबेस लोकल एमुलेटर सूट का उपयोग कैसे करें।

आपको किस चीज़ की ज़रूरत पड़ेगी

  • नवीनतम एंड्रॉइड स्टूडियो संस्करण।
  • एंड्रॉइड 5.0+ के साथ एक एंड्रॉइड एमुलेटर
  • Node.js संस्करण 10 या उच्चतर (एमुलेटर सुइट का उपयोग करने के लिए)।
  • जावा 8 या उच्चतर. जावा स्थापित करने के लिए इन निर्देशों का उपयोग करें; अपना संस्करण जांचने के लिए, java -version चलाएँ।
  • कोटलिन प्रोग्रामिंग भाषा से परिचित होना।

2. नमूना कोड प्राप्त करें

रिपॉजिटरी को क्लोन करें

कमांड लाइन से GitHub रिपॉजिटरी को क्लोन करें:

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

एंड्रॉइड स्टूडियो में आयात करें

एंड्रॉइड स्टूडियो में, फ़ाइल > ओपन चुनें, फिर build-android-start निर्देशिका चुनें ( android_studio_folder ) उस निर्देशिका से जहां आपने नमूना कोड डाउनलोड किया था।

अब आपके पास एंड्रॉइड स्टूडियो में build-android-start प्रोजेक्ट खुला होना चाहिए। यदि आपको google-services.json फ़ाइल के गुम होने की चेतावनी दिखाई देती है, तो चिंता न करें। इसे बाद के चरण में जोड़ा जाएगा.

निर्भरता की जाँच करें

इस कोडलैब में आपके लिए आवश्यक सभी निर्भरताएं पहले ही जोड़ दी गई हैं, लेकिन यह समझना महत्वपूर्ण है कि फायरबेस एसडीके को अपने ऐप में कैसे जोड़ा जाए:

बिल्ड.ग्रेडल.केटीएस

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
}

ऐप/बिल्ड.ग्रेडल.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. फायरबेस सीएलआई स्थापित करें

इस कोडलैब में आप फायरबेस ऑथ, रीयलटाइम डेटाबेस और क्लाउड स्टोरेज का स्थानीय रूप से अनुकरण करने के लिए फायरबेस एमुलेटर सूट का उपयोग करेंगे। यह आपके ऐप को बनाने के लिए एक सुरक्षित, तेज़ और बिना लागत वाला स्थानीय विकास वातावरण प्रदान करता है।

फायरबेस सीएलआई स्थापित करें

सबसे पहले आपको फायरबेस सीएलआई इंस्टॉल करना होगा। यदि आप macOS या Linux का उपयोग कर रहे हैं, तो आप निम्न cURL कमांड चला सकते हैं:

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

यदि आप विंडोज़ का उपयोग कर रहे हैं, तो स्टैंडअलोन बाइनरी प्राप्त करने के लिए या npm के माध्यम से इंस्टॉल करने के लिए इंस्टॉलेशन निर्देश पढ़ें।

एक बार जब आप सीएलआई स्थापित कर लेते हैं, तो firebase --version चलाने पर 9.0.0 या उच्चतर संस्करण की सूचना मिलनी चाहिए:

$ firebase --version
9.0.0

लॉग इन करें

सीएलआई को अपने Google खाते से कनेक्ट करने के लिए firebase login चलाएँ। यह लॉगिन प्रक्रिया को पूरा करने के लिए एक नई ब्राउज़र विंडो खोलेगा। सुनिश्चित करें कि आपने वही खाता चुना है जिसका उपयोग आपने पहले अपना फायरबेस प्रोजेक्ट बनाते समय किया था।

4. फायरबेस एमुलेटर सुइट से कनेक्ट करें

एमुलेटर प्रारंभ करें

अपने टर्मिनल में, अपनी स्थानीय codelab-friendlychat-android निर्देशिका के रूट से निम्नलिखित कमांड चलाएँ:

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

आपको इस तरह के कुछ लॉग देखने चाहिए. पोर्ट मान को firebase.json फ़ाइल में परिभाषित किया गया था, जिसे क्लोन किए गए नमूना कोड में शामिल किया गया था।

$ firebase emulators:start --project=demo-friendlychat-android
i  emulators: Starting emulators: auth, database, storage
i  emulators: Detected demo project ID "demo-friendlychat-android", emulated services will use a demo configuration and attempts to access non-emulated services for this project will fail.
i  database: Database Emulator logging to database-debug.log
i  ui: Emulator UI logging to ui-debug.log

┌─────────────────────────────────────────────────────────────┐
│ ✔  All emulators ready! It is now safe to connect your app. │
│ i  View Emulator UI at http://localhost:4000                │
└─────────────────────────────────────────────────────────────┘

┌────────────────┬────────────────┬────────────────────────────────┐
│ Emulator       │ Host:Port      │ View in Emulator UI            │
├────────────────┼────────────────┼────────────────────────────────┤
│ Authentication │ localhost:9099 │ http://localhost:4000/auth     │
├────────────────┼────────────────┼────────────────────────────────┤
│ Database       │ localhost:9000 │ http://localhost:4000/database │
├────────────────┼────────────────┼────────────────────────────────┤
│ Storage        │ localhost:9199 │ http://localhost:4000/storage  │
└────────────────┴────────────────┴────────────────────────────────┘
  Emulator Hub running at localhost:4400
  Other reserved ports: 4500

Issues? Report them at https://github.com/firebase/firebase-tools/issues and attach the *-debug.log files.

फायरबेस एम्यूलेटर सुइट यूआई देखने के लिए अपने वेब ब्राउज़र में http://localhost:4000 पर जाएँ:

एम्यूलेटर सुइट यूआई होम

शेष कोडलैब के लिए 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)
}

5. स्टार्टर ऐप चलाएँ

google-services.json जोड़ें

अपने एंड्रॉइड ऐप को फायरबेस से कनेक्ट करने के लिए, आपको अपने एंड्रॉइड प्रोजेक्ट के app फ़ोल्डर के अंदर एक google-services.json फ़ाइल जोड़नी होगी। इस कोडलैब के प्रयोजनों के लिए, हमने एक नकली JSON फ़ाइल प्रदान की है जो आपको फायरबेस एमुलेटर सूट से कनेक्ट करने की अनुमति देगी।

mock-google-services.json फ़ाइल को build-android-start/app फ़ोल्डर में google-services.json के रूप में कॉपी करें:

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

इस कोडलैब के अंतिम चरण में, आप सीखेंगे कि एक वास्तविक फायरबेस प्रोजेक्ट और फायरबेस एंड्रॉइड ऐप कैसे बनाया जाए ताकि आप इस नकली JSON फ़ाइल को अपने कॉन्फ़िगरेशन से बदल सकें।

ऐप चलाएँ

अब जब आपने प्रोजेक्ट को एंड्रॉइड स्टूडियो में आयात कर लिया है और एक फायरबेस कॉन्फ़िगरेशन JSON फ़ाइल जोड़ दी है, तो आप पहली बार ऐप चलाने के लिए तैयार हैं।

  1. अपना एंड्रॉइड एमुलेटर प्रारंभ करें।
  2. एंड्रॉइड स्टूडियो में, रन पर क्लिक करें ( निष्पादित करना ) टूलबार में।

ऐप आपके एंड्रॉइड एमुलेटर पर लॉन्च होना चाहिए। इस बिंदु पर, आपको एक खाली संदेश सूची देखनी चाहिए, और संदेश भेजना और प्राप्त करना काम नहीं करेगा। इस कोडलैब के अगले चरण में, आप उपयोगकर्ताओं को प्रमाणित करेंगे ताकि वे फ्रेंडली चैट का उपयोग कर सकें।

6. प्रमाणीकरण सक्षम करें

यह ऐप सभी चैट संदेशों को संग्रहीत करने के लिए फायरबेस रीयलटाइम डेटाबेस का उपयोग करेगा। हालाँकि, डेटा जोड़ने से पहले, हमें यह सुनिश्चित करना चाहिए कि ऐप सुरक्षित है और केवल प्रमाणित उपयोगकर्ता ही संदेश पोस्ट कर सकते हैं। इस चरण में, हम फायरबेस प्रमाणीकरण सक्षम करेंगे और रीयलटाइम डेटाबेस सुरक्षा नियमों को कॉन्फ़िगर करेंगे।

बुनियादी साइन-इन कार्यक्षमता जोड़ें

इसके बाद हम उपयोगकर्ताओं का पता लगाने और साइन-इन स्क्रीन लागू करने के लिए ऐप में कुछ बुनियादी फायरबेस प्रमाणीकरण कोड जोड़ेंगे।

वर्तमान उपयोगकर्ता की जाँच करें

सबसे पहले निम्नलिखित इंस्टेंस वेरिएबल को MainActivity.kt क्लास में जोड़ें:

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

अब जब भी उपयोगकर्ता ऐप खोलें और अप्रमाणित हो तो उसे साइन-इन स्क्रीन पर भेजने के लिए MainActivity संशोधित करें। दृश्य से binding संलग्न होने के बाद निम्नलिखित को onCreate() विधि में जोड़ें:

MainActivity.kt

// Initialize Firebase Auth and check if the user is signed in
auth = Firebase.auth
if (auth.currentUser == null) {
    // Not signed in, launch the Sign In activity
    startActivity(Intent(this, SignInActivity::class.java))
    finish()
    return
}

हम यह भी जांचना चाहते हैं कि उपयोगकर्ता onStart() के दौरान साइन इन है या नहीं:

MainActivity.kt

public override fun onStart() {
    super.onStart()
    // Check if user is signed in.
    if (auth.currentUser == null) {
        // Not signed in, launch the Sign In activity
        startActivity(Intent(this, SignInActivity::class.java))
        finish()
        return
    }
}

फिर वर्तमान में प्रमाणित फायरबेस उपयोगकर्ता के बारे में उचित जानकारी वापस करने के लिए getUserPhotoUrl() और getUserName() तरीकों को लागू करें:

MainActivity.kt

private fun getPhotoUrl(): String? {
    val user = auth.currentUser
    return user?.photoUrl?.toString()
}

private fun getUserName(): String? {
    val user = auth.currentUser
    return if (user != null) {
        user.displayName
    } else ANONYMOUS
}

फिर साइन आउट बटन को संभालने के लिए signOut() विधि लागू करें:

MainActivity.kt

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

अब हमारे पास आवश्यकता पड़ने पर उपयोगकर्ता को साइन-इन स्क्रीन पर भेजने के लिए सभी तर्क मौजूद हैं। इसके बाद हमें उपयोगकर्ताओं को उचित रूप से प्रमाणित करने के लिए साइन-इन स्क्रीन को लागू करने की आवश्यकता है।

साइन-इन स्क्रीन लागू करें

फ़ाइल SignInActivity.kt खोलें। यहां प्रमाणीकरण आरंभ करने के लिए एक सरल साइन-इन बटन का उपयोग किया जाता है। इस अनुभाग में, आप साइन इन के लिए तर्क को लागू करने के लिए FirebaseUI का उपयोग करेंगे।

// Firebase instance variables टिप्पणी के अंतर्गत SignInActivity क्लास में एक ऑथ इंस्टेंस वेरिएबल जोड़ें:

साइनइनएक्टिविटी.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

फिर, फायरबेस को आरंभ करने के लिए onCreate() विधि को उसी तरह संपादित करें जैसे आपने MainActivity में किया था:

साइनइनएक्टिविटी.kt

// Initialize FirebaseAuth
auth = Firebase.auth

SignInActivity में एक ActivityResultLauncher फ़ील्ड जोड़ें:

साइनइनएक्टिविटी.kt

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

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

इसके बाद, FirebaseUI साइन इन फ़्लो को शुरू करने के लिए onStart() विधि को संपादित करें:

साइनइनएक्टिविटी.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 के साथ प्रमाणीकरण लागू किया है।

अपने काम का परीक्षण करें

अपने एंड्रॉइड एमुलेटर पर ऐप चलाएं। आपको तुरंत साइन-इन स्क्रीन पर भेजा जाना चाहिए। ईमेल से साइन इन करें बटन पर टैप करें, फिर एक खाता बनाएं। यदि सब कुछ सही ढंग से लागू किया गया है, तो आपको मैसेजिंग स्क्रीन पर भेजा जाना चाहिए।

साइन इन करने के बाद, अपने ब्राउज़र में फायरबेस एमुलेटर सुइट यूआई खोलें, फिर इस पहले साइन-इन उपयोगकर्ता खाते को देखने के लिए प्रमाणीकरण टैब पर क्लिक करें।

7. संदेश पढ़ें

इस चरण में, हम रीयलटाइम डेटाबेस में संग्रहीत संदेशों को पढ़ने और प्रदर्शित करने के लिए कार्यक्षमता जोड़ेंगे।

नमूना संदेश आयात करें

  1. फायरबेस एमुलेटर सुइट यूआई में, रीयलटाइम डेटाबेस टैब चुनें।
  2. कोडलैब रिपॉजिटरी की अपनी स्थानीय प्रतिलिपि से initial_messages.json फ़ाइल को डेटा व्यूअर में खींचें और छोड़ें।

अब आपके पास डेटाबेस के messages नोड के अंतर्गत कुछ संदेश होने चाहिए।

डेटा पढ़ें

संदेशों को सिंक्रनाइज़ करें

इस अनुभाग में हम वह कोड जोड़ते हैं जो नए जोड़े गए संदेशों को ऐप यूआई में सिंक्रनाइज़ करता है:

  • फायरबेस रीयलटाइम डेटाबेस को आरंभ करना और डेटा में किए गए परिवर्तनों को संभालने के लिए एक श्रोता को जोड़ना।
  • RecyclerView एडॉप्टर को अपडेट किया जा रहा है ताकि नए संदेश दिखाए जा सकें।
  • MainActivity वर्ग में अपने अन्य फायरबेस इंस्टेंस वेरिएबल के साथ डेटाबेस इंस्टेंस वेरिएबल जोड़ना:

MainActivity.kt

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

टिप्पणी के तहत अपनी MainActivity की onCreate() विधि को संशोधित करें // Initialize Realtime Database and FirebaseRecyclerAdapter । यह कोड रीयलटाइम डेटाबेस से सभी मौजूदा संदेशों को जोड़ता है और फिर आपके फायरबेस रीयलटाइम डेटाबेस में messages पथ के तहत नई चाइल्ड प्रविष्टियों को सुनता है। यह प्रत्येक संदेश के लिए यूआई में एक नया तत्व जोड़ता है:

MainActivity.kt

// Initialize Realtime Database
db = Firebase.database
val messagesRef = db.reference.child(MESSAGES_CHILD)

// The FirebaseRecyclerAdapter class and options come from the FirebaseUI library
// See: https://github.com/firebase/FirebaseUI-Android
val options = FirebaseRecyclerOptions.Builder<FriendlyMessage>()
    .setQuery(messagesRef, FriendlyMessage::class.java)
    .build()
adapter = FriendlyMessageAdapter(options, getUserName())
binding.progressBar.visibility = ProgressBar.INVISIBLE
manager = LinearLayoutManager(this)
manager.stackFromEnd = true
binding.messageRecyclerView.layoutManager = manager
binding.messageRecyclerView.adapter = adapter

// Scroll down when a new message arrives
// See MyScrollToBottomObserver for details
adapter.registerAdapterDataObserver(
    MyScrollToBottomObserver(binding.messageRecyclerView, adapter, manager)
)

FriendlyMessageAdapter.kt क्लास में अगला आंतरिक क्लास MessageViewHolder() के भीतर bind() विधि लागू करें:

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

हमें उन संदेशों को प्रदर्शित करने की भी आवश्यकता है जो छवियां हैं, इसलिए आंतरिक वर्ग ImageMessageViewHolder() के भीतर bind() विधि को भी लागू करें:

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 रीयलटाइम डेटाबेस से अपडेट सुनना शुरू करें और बंद करें। MainActivity में onPause() और onResume() तरीकों को अपडेट करें जैसा कि नीचे दिखाया गया है:

MainActivity.kt

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

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

संदेशों को समन्वयित करने का परीक्षण करें

  1. चलाएँ पर क्लिक करें ( निष्पादित करना ).
  2. एम्यूलेटर सुइट यूआई में, रीयलटाइम डेटाबेस टैब पर वापस लौटें, फिर मैन्युअल रूप से एक नया संदेश जोड़ें। पुष्टि करें कि संदेश आपके एंड्रॉइड ऐप में दिखाई देता है:

बधाई हो, आपने अभी-अभी अपने ऐप में एक रीयलटाइम डेटाबेस जोड़ा है!

8. संदेश भेजें

पाठ संदेश भेजना कार्यान्वित करें

इस अनुभाग में, आप ऐप उपयोगकर्ताओं के लिए टेक्स्ट संदेश भेजने की क्षमता जोड़ देंगे। नीचे दिया गया कोड स्निपेट सेंड बटन पर क्लिक इवेंट को सुनता है, संदेश फ़ील्ड की सामग्री के साथ एक नया FriendlyMessage ऑब्जेक्ट बनाता है, और संदेश को डेटाबेस में भेजता है। push() विधि स्वचालित रूप से जेनरेट की गई आईडी को पुश किए गए ऑब्जेक्ट के पथ में जोड़ती है। ये आईडी अनुक्रमिक हैं जो सुनिश्चित करती हैं कि नए संदेश सूची के अंत में जोड़े जाएंगे।

MainActivity क्लास में onCreate() विधि में सेंड बटन के क्लिक श्रोता को अपडेट करें। यह कोड पहले से ही onCreate() विधि के नीचे है। नीचे दिए गए कोड से मिलान करने के लिए onClick() बॉडी को अपडेट करें:

MainActivity.kt

// Disable the send button when there's no text in the input field
// See MyButtonObserver for details
binding.messageEditText.addTextChangedListener(MyButtonObserver(binding.sendButton))

// When the send button is clicked, send a text message
binding.sendButton.setOnClickListener {
    val friendlyMessage = FriendlyMessage(
        binding.messageEditText.text.toString(),
        getUserName(),
        getPhotoUrl(),
        null /* no image */
    )
    db.reference.child(MESSAGES_CHILD).push().setValue(friendlyMessage)
    binding.messageEditText.setText("")
}

छवि संदेश भेजना कार्यान्वित करें

इस अनुभाग में, आप ऐप उपयोगकर्ताओं के लिए छवि संदेश भेजने की क्षमता जोड़ देंगे। एक छवि संदेश बनाना इन चरणों से किया जाता है:

  • छवि चुने
  • छवि चयन संभालें
  • रीयलटाइम डेटाबेस पर अस्थायी छवि संदेश लिखें
  • चयनित छवि अपलोड करना प्रारंभ करें
  • अपलोड पूरा होने पर छवि संदेश URL को अपलोड की गई छवि के URL में अपडेट करें

छवि चुने

छवियां जोड़ने के लिए यह कोडलैब फायरबेस के लिए क्लाउड स्टोरेज का उपयोग करता है। क्लाउड स्टोरेज आपके ऐप के बाइनरी डेटा को स्टोर करने के लिए एक अच्छी जगह है।

छवि चयन संभालें और अस्थायी संदेश लिखें

एक बार जब उपयोगकर्ता एक छवि का चयन कर लेता है, तो छवि चयन Intent लॉन्च हो जाता है। यह onCreate() विधि के अंत में कोड में पहले से ही लागू किया गया है। समाप्त होने पर यह MainActivity की 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)
                    })
}

छवि अपलोड करें और संदेश अपडेट करें

MainActivity में putImageInStorage() विधि जोड़ें। चयनित छवि का अपलोड आरंभ करने के लिए इसे onImageSelected() में कॉल किया जाता है। एक बार अपलोड पूरा हो जाने पर आप उचित छवि का उपयोग करने के लिए संदेश को अपडेट कर देंगे।

MainActivity.kt

private fun putImageInStorage(storageReference: StorageReference, uri: Uri, key: String?) {
    // First upload the image to Cloud Storage
    storageReference.putFile(uri)
        .addOnSuccessListener(
            this
        ) { taskSnapshot -> // After the image loads, get a public downloadUrl for the image
            // and add it to the message.
            taskSnapshot.metadata!!.reference!!.downloadUrl
                .addOnSuccessListener { uri ->
                    val friendlyMessage =
                        FriendlyMessage(null, getUserName(), getPhotoUrl(), uri.toString())
                    db.reference
                        .child(MESSAGES_CHILD)
                        .child(key!!)
                        .setValue(friendlyMessage)
                }
        }
        .addOnFailureListener(this) { e ->
            Log.w(
                TAG,
                "Image upload task was unsuccessful.",
                e
            )
        }
}

संदेश भेजने का परीक्षण करें

  1. एंड्रॉइड स्टूडियो में, क्लिक करें निष्पादित करना चलाएँ बटन.
  2. अपने एंड्रॉइड एमुलेटर में, एक संदेश दर्ज करें, फिर भेजें बटन पर टैप करें। नया संदेश ऐप यूआई और फायरबेस एमुलेटर सुइट यूआई में दिखाई देना चाहिए।
  3. एंड्रॉइड एमुलेटर में, अपने डिवाइस से एक छवि का चयन करने के लिए "+" छवि पर टैप करें। नया संदेश पहले प्लेसहोल्डर छवि के साथ दिखाई देना चाहिए, और फिर छवि अपलोड पूरा होने के बाद चयनित छवि के साथ दिखाई देना चाहिए। नया संदेश एमुलेटर सुइट यूआई में भी दिखाई देना चाहिए, विशेष रूप से रीयलटाइम डेटाबेस टैब में एक ऑब्जेक्ट के रूप में और स्टोरेज टैब में एक ब्लॉब के रूप में।

9. बधाई हो!

आपने अभी-अभी फायरबेस का उपयोग करके एक रीयल-टाइम चैट एप्लिकेशन बनाया है!

आपने क्या सीखा

  • फायरबेस प्रमाणीकरण
  • फायरबेस रीयलटाइम डेटाबेस
  • फायरबेस के लिए क्लाउड स्टोरेज

इसके बाद, अपने एंड्रॉइड ऐप में फायरबेस जोड़ने के लिए इस कोडलैब में आपने जो सीखा है उसका उपयोग करने का प्रयास करें! फायरबेस के बारे में अधिक जानने के लिए, firebase.google.com पर जाएं।

यदि आप सीखना चाहते हैं कि वास्तविक फायरबेस प्रोजेक्ट कैसे स्थापित करें और वास्तविक फायरबेस संसाधनों का उपयोग कैसे करें (डेमो प्रोजेक्ट और केवल अनुकरणीय संसाधनों के बजाय), तो अगले चरण पर जारी रखें।

नोट: आपके द्वारा एक वास्तविक फायरबेस प्रोजेक्ट स्थापित करने के बाद भी और विशेष रूप से जब आप एक वास्तविक ऐप बनाना शुरू करते हैं, तो हम विकास और परीक्षण के लिए फायरबेस लोकल एमुलेटर सूट का उपयोग करने की सलाह देते हैं।

10. वैकल्पिक: एक फायरबेस प्रोजेक्ट बनाएं और सेट करें

इस चरण में, आप इस कोडलैब के साथ उपयोग करने के लिए एक वास्तविक फायरबेस प्रोजेक्ट और एक फायरबेस एंड्रॉइड ऐप बनाएंगे। आप अपने ऐप-विशिष्ट फ़ायरबेस कॉन्फ़िगरेशन को भी अपने ऐप में जोड़ेंगे। और अंत में, आप अपने ऐप के साथ उपयोग करने के लिए वास्तविक फायरबेस संसाधन स्थापित करेंगे।

एक फायरबेस प्रोजेक्ट बनाएं

  1. अपने ब्राउज़र में, फ़ायरबेस कंसोल पर जाएँ।
  2. प्रोजेक्ट जोड़ें चुनें.
  3. प्रोजेक्ट का नाम चुनें या दर्ज करें. आप अपनी इच्छानुसार कोई भी नाम उपयोग कर सकते हैं.
  4. इस कोडलैब के लिए आपको Google Analytics की आवश्यकता नहीं है, इसलिए आप इसे अपने प्रोजेक्ट के लिए सक्षम करना छोड़ सकते हैं।
  5. प्रोजेक्ट बनाएं पर क्लिक करें. जब आपका प्रोजेक्ट तैयार हो जाए, तो जारी रखें पर क्लिक करें।

अपने एंड्रॉइड प्रोजेक्ट में फायरबेस जोड़ें

इस चरण को शुरू करने से पहले, अपने ऐप का SHA1 हैश प्राप्त करें। अपनी डिबग कुंजी का SHA1 निर्धारित करने के लिए अपनी स्थानीय build-android-start निर्देशिका से निम्न कमांड चलाएँ:

./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 हैश ढूंढने में असमर्थ हैं, तो अधिक जानकारी के लिए यह पृष्ठ देखें।

फायरबेस कंसोल पर वापस जाएं, और अपने एंड्रॉइड प्रोजेक्ट को अपने फायरबेस प्रोजेक्ट के साथ पंजीकृत करने के लिए इन चरणों का पालन करें:

  1. अपने नए प्रोजेक्ट की अवलोकन स्क्रीन से, सेटअप वर्कफ़्लो लॉन्च करने के लिए एंड्रॉइड आइकन पर क्लिक करें: एंड्रॉइड ऐप जोड़ें
  2. अगली स्क्रीन पर, अपने ऐप के पैकेज नाम के रूप में com.google.firebase.codelab.friendlychat दर्ज करें।
  3. रजिस्टर ऐप पर क्लिक करें, फिर अपनी फायरबेस कॉन्फ़िगरेशन फ़ाइल डाउनलोड करने के लिए google-services.json डाउनलोड करें पर क्लिक करें।
  4. google-services.json फ़ाइल को अपने Android प्रोजेक्ट की app निर्देशिका में कॉपी करें।
  5. कंसोल के सेटअप वर्कफ़्लो में दिखाए गए अगले चरणों को छोड़ें (वे build-android-start प्रोजेक्ट में आपके लिए पहले ही किए जा चुके हैं)।
  6. अपने प्रोजेक्ट को ग्रैडल फ़ाइलों के साथ समन्वयित करके सुनिश्चित करें कि सभी निर्भरताएँ आपके ऐप पर उपलब्ध हैं। एंड्रॉइड स्टूडियो टूलबार से, फ़ाइल > ग्रैडल फ़ाइलों के साथ सिंक प्रोजेक्ट चुनें। कॉन्फ़िगरेशन परिवर्तन करने के लिए आपको बिल्ड/क्लीन प्रोजेक्ट और बिल्ड/रीबिल्ड प्रोजेक्ट चलाने की भी आवश्यकता हो सकती है।

फायरबेस प्रमाणीकरण कॉन्फ़िगर करें

इससे पहले कि आपका ऐप आपके उपयोगकर्ताओं की ओर से फायरबेस प्रमाणीकरण एपीआई तक पहुंच सके, आपको फायरबेस प्रमाणीकरण और साइन-इन प्रदाताओं को सक्षम करना होगा जिन्हें आप अपने ऐप में उपयोग करना चाहते हैं।

  1. फायरबेस कंसोल में, बाईं ओर के नेविगेशन पैनल से प्रमाणीकरण का चयन करें।
  2. साइन-इन विधि टैब चुनें.
  3. ईमेल/पासवर्ड पर क्लिक करें, फिर स्विच को सक्षम (नीला) पर टॉगल करें।
  4. Google पर क्लिक करें, फिर स्विच को सक्षम (नीला) पर टॉगल करें और एक प्रोजेक्ट समर्थन ईमेल सेट करें।

यदि आपको बाद में इस कोडलैब में "CONFIGURATION_NOT_FOUND" संदेश के साथ त्रुटियां मिलती हैं, तो इस चरण पर वापस आएं और अपने काम की दोबारा जांच करें।

रीयलटाइम डेटाबेस कॉन्फ़िगर करें

इस कोडलैब का ऐप फायरबेस रीयलटाइम डेटाबेस में चैट संदेशों को संग्रहीत करता है। इस अनुभाग में, हम एक डेटाबेस बनाएंगे और उसकी सुरक्षा को फायरबेस सुरक्षा नियम नामक JSON कॉन्फ़िगरेशन भाषा के माध्यम से कॉन्फ़िगर करेंगे।

  1. फायरबेस कंसोल में, बाईं ओर के नेविगेशन पैनल से रीयलटाइम डेटाबेस का चयन करें।
  2. नया रीयलटाइम डेटाबेस इंस्टेंस बनाने के लिए डेटाबेस बनाएँ पर क्लिक करें। संकेत मिलने पर, us-central1 क्षेत्र का चयन करें, फिर अगला क्लिक करें।
  3. सुरक्षा नियमों के बारे में पूछे जाने पर, लॉक मोड चुनें, फिर सक्षम करें पर क्लिक करें।
  4. एक बार डेटाबेस इंस्टेंस बन जाने के बाद, नियम टैब का चयन करें, फिर निम्नलिखित के साथ नियम कॉन्फ़िगरेशन को अपडेट करें:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

सुरक्षा नियम कैसे काम करते हैं ("ऑथ" वेरिएबल पर दस्तावेज़ीकरण सहित) के बारे में अधिक जानकारी के लिए, रीयलटाइम डेटाबेस सुरक्षा दस्तावेज़ देखें।

फायरबेस के लिए क्लाउड स्टोरेज कॉन्फ़िगर करें

  1. फायरबेस कंसोल में, बाईं ओर के नेविगेशन पैनल से स्टोरेज का चयन करें।
  2. अपने प्रोजेक्ट के लिए क्लाउड स्टोरेज सक्षम करने के लिए आरंभ करें पर क्लिक करें।
  3. सुझाए गए डिफ़ॉल्ट का उपयोग करके, अपना बकेट सेट करने के लिए संवाद में दिए गए चरणों का पालन करें।

फायरबेस संसाधनों से कनेक्ट करें

इस कोडलैब के पहले चरण में, आपने MainActivity.kt में निम्नलिखित जोड़ा था। इस सशर्त ब्लॉक ने आपके एंड्रॉइड प्रोजेक्ट को फायरबेस एमुलेटर सूट से जोड़ा।

// 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.DEBUG false हो।