Firebase Android Codelab - Samimi Sohbet Oluşturun

1. Genel Bakış

ekran görüntüsü

Resim: Çalışan Dostu Sohbet uygulaması.

Samimi Sohbet codelab'ine hoş geldiniz. Bu codelab'de, Android'de sohbet uygulaması oluşturmak için Firebase platformunu nasıl kullanacağınızı öğreneceksiniz.

Neler öğreneceksiniz?

  • Kullanıcıların oturum açmasına izin vermek için Firebase Authentication'ı kullanma.
  • Firebase Realtime Database'i kullanarak verileri senkronize etme.
  • Firebase için Cloud Storage'da ikili dosyaları depolama.
  • Firebase ile Android uygulaması geliştirmek için Firebase Local Emulator Suite'i kullanma.

Gerekenler

  • En son Android Studio sürümü.
  • Android 5.0 ve sonraki sürümlere sahip bir Android Emülatör.
  • Node.js sürüm 10 veya sonraki sürümler (Emulator Suite'i kullanmak için).
  • Java 8 veya sonraki sürümler. Java'yı yüklemek için şu talimatları kullanın: sürümünüzü kontrol etmek için java -version komutunu çalıştırın.
  • Kotlin programlama diline aşinalık.

2. Örnek kodu alın

Depoyu klonlama

GitHub deposunu komut satırından klonlayın:

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

Android Studio'ya aktarma

Android Studio'da Dosya > 'ı tıklayın, ardından örnek kodu indirdiğiniz dizinden build-android-start dizinini ( android_studio_klasörü) seçin.

Artık Android Studio'da build-android-start projesi açık olmalıdır. google-services.json dosyasının eksik olduğunu belirten bir uyarı görürseniz endişelenmeyin. Sonraki bir adımda eklenecektir.

Bağımlılıkları kontrol etme

Bu codelab'de, ihtiyacınız olan tüm bağımlılıklar sizin için zaten eklenmiş olsa da Firebase SDK'sını uygulamanıza nasıl ekleyeceğinizi anlamanız önemlidir:

derleme.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. Firebase CLI'ı yükleme

Bu codelab'de Firebase Auth, Realtime Database ve Cloud Storage'ı yerel olarak emüle etmek için Firebase Emulator Suite'i kullanacaksınız. Böylece, uygulamanızı geliştirmek için güvenli, hızlı ve ücretsiz bir yerel geliştirme ortamı elde edebilirsiniz.

Firebase CLI'ı yükleme

Öncelikle Firebase CLI'ı yüklemeniz gerekir. macOS veya Linux kullanıyorsanız aşağıdaki cURL komutunu çalıştırabilirsiniz:

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

Windows kullanıyorsanız, bağımsız bir ikili program edinmek veya npm üzerinden yüklemek için yükleme talimatlarını okuyun.

KSA yüklendikten sonra firebase --version çalıştırıldığında 9.0.0 veya sonraki bir sürüm bildirilmelidir:

$ firebase --version
9.0.0

Giriş yap

KSA'yı Google Hesabınıza bağlamak için firebase login komutunu çalıştırın. Bu, giriş işlemini tamamlamak için yeni bir tarayıcı penceresi açar. Daha önce Firebase projenizi oluştururken kullandığınız hesabı seçtiğinizden emin olun.

4. Firebase Emulator Suite'e bağlanın

Emülatörleri başlatma

Terminalinizde, yerel codelab-friendlychat-android dizininizin kök dizininden aşağıdaki komutu çalıştırın:

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

Bunun gibi bazı günlükler göreceksiniz. Bağlantı noktası değerleri, klonlanan örnek kodda bulunan firebase.json dosyasında tanımlanmıştı.

$ 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 kullanıcı arayüzünü görüntülemek için web tarayıcınızda http://localhost:4000 adresine gidin:

Emulator Suite kullanıcı arayüzü ana sayfası

Codelab'in geri kalanında emulators:start komutunu çalışır durumda bırakın.

Uygulamanızı bağlayın

Android Studio'da MainActivity.kt uygulamasını açın, ardından onCreate yönteminin içine aşağıdaki kodu ekleyin:

// 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. Başlangıç uygulamasını çalıştırma

google-services.json ekle

Android uygulamanızın Firebase'e bağlanması için Android projenizin app klasörüne bir google-services.json dosyası eklemeniz gerekir. Bu codelab'in amaçları doğrultusunda, Firebase Emulator Suite'e bağlanmanızı sağlayacak bir JSON dosyası hazırladık.

mock-google-services.json dosyasını build-android-start/app klasörüne google-services.json olarak kopyalayın:

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

Bu codelab'in son adımında bu örnek JSON dosyasını kendi yapılandırmanızla değiştirmek için gerçek bir Firebase projesi ve Firebase Android uygulaması oluşturmayı öğreneceksiniz.

Uygulamayı çalıştırın

Projeyi Android Studio'ya aktardığınız ve Firebase yapılandırma JSON dosyası eklediğinize göre, uygulamayı ilk kez çalıştırmaya hazırsınız.

  1. Android Emülatörünüzü başlatın.
  2. Android Studio'da, araç çubuğunda Çalıştır'ı ( execute) tıklayın.

Uygulama, Android Emülatörünüzde başlatılır. Bu noktada boş bir ileti listesi görmeniz gerekir. İleti gönderme ve alma işlemleri çalışmaz. Bu codelab'in bir sonraki adımında Uyumlu Sohbet'i kullanabilmeleri için kullanıcıların kimliğini doğrulayacaksınız.

6. Kimlik Doğrulamayı Etkinleştir

Bu uygulama, tüm sohbet mesajlarını depolamak için Firebase Realtime Database'i kullanacak. Ancak veri eklemeden önce uygulamanın güvenli olduğundan ve yalnızca kimliği doğrulanmış kullanıcıların ileti gönderebildiğinden emin olmamız gerekir. Bu adımda Firebase Authentication'ı etkinleştirecek ve Gerçek Zamanlı Veritabanı Güvenlik Kurallarını yapılandıracağız.

Temel oturum açma işlevini ekleyin

Ardından, kullanıcıları algılamak ve bir oturum açma ekranı uygulamak için uygulamaya bazı temel Firebase Authentication kodları ekleyeceğiz.

Geçerli kullanıcıyı kontrol et

Öncelikle aşağıdaki örnek değişkenini MainActivity.kt sınıfına ekleyin:

MainActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Şimdi MainActivity öğesini, uygulamayı her açtığında ve kimliği doğrulanmamış olduğunda kullanıcıyı oturum açma ekranına gönderecek şekilde değiştirelim. binding görünüme eklendikten sonra onCreate() yöntemine aşağıdakini ekleyin:

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
}

Kullanıcının oturum açıp açmadığını 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
    }
}

Ardından, kimliği doğrulanmış olan Firebase kullanıcısı hakkında uygun bilgileri döndürmek için getUserPhotoUrl() ve getUserName() yöntemlerini uygulayın:

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
}

Ardından, oturumu kapatma düğmesini işlemek için signOut() yöntemini uygulayın:

MainActivity.kt

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

Artık gerektiğinde kullanıcıyı oturum açma ekranına göndermek için gereken tüm mantığı kullanabiliriz. Ardından, kullanıcıların kimliklerini doğru şekilde doğrulamak için oturum açma ekranını uygulamamız gerekir.

Oturum açma ekranını uygulama

SignInActivity.kt dosyasını açın. Burada, kimlik doğrulamayı başlatmak için basit bir Oturum Aç düğmesi kullanılır. Bu bölümde, oturum açma mantığını uygulamak için FirebaseUI'yi kullanacaksınız.

SignInActivity sınıfında, // Firebase instance variables yorumunun altına bir Auth örneği değişkeni ekleyin:

SignInActivity.kt

// Firebase instance variables
private lateinit var auth: FirebaseAuth

Ardından, MainActivity içerisinde yaptığınız gibi Firebase'i başlatmak için onCreate() yöntemini düzenleyin:

SignInActivity.kt

// Initialize FirebaseAuth
auth = Firebase.auth

SignInActivity öğesine ActivityResultLauncher alanı ekleyin:

SignInActivity.kt

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

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

Ardından, FirebaseUI oturum açma akışını başlatmak için onStart() yöntemini düzenleyin:

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

Daha sonra, oturum açma sonucunu işlemek için onSignInResult yöntemini uygulayın. Oturum açma işlemi başarılı olduysa MainActivity bölümüne geçin:

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

Hepsi bu kadar! Sunucu tarafı yapılandırmaları yönetmeniz gerekmeden, FirebaseUI ile kimlik doğrulamasını yalnızca birkaç yöntem çağrısında uyguladınız.

Çalışmanızı test etme

Uygulamayı Android Emülatörünüzde çalıştırın. Hemen oturum açma ekranına yönlendirilirsiniz. E-posta ile oturum aç düğmesine dokunun, ardından bir hesap oluşturun. Her şey doğru uygulandığında mesajlaşma ekranına yönlendirilirsiniz.

Oturum açtıktan sonra tarayıcınızda Firebase Emulator Suite kullanıcı arayüzünü açın, ardından oturum açan bu ilk kullanıcı hesabını görmek için Kimlik Doğrulama sekmesini tıklayın.

7. Mesajları okuma

Bu adımda, Realtime Database'de depolanan mesajları okuma ve görüntüleme işlevi ekleyeceğiz.

Örnek mesajları içe aktarma

  1. Firebase Emulator Suite kullanıcı arayüzünde Realtime Database sekmesini seçin.
  2. initial_messages.json dosyasını, codelab deponuzun yerel kopyasından veri görüntüleyiciye sürükleyip bırakın.

Artık veritabanının messages düğümü altında birkaç iletiniz olmalıdır.

Verileri okuma

İletileri senkronize etme

Bu bölümde, yeni eklenen mesajları aşağıdaki şekilde uygulama kullanıcı arayüzüne senkronize eden bir kod ekleriz:

  • Firebase Realtime Database'i başlatma ve verilerde yapılan değişiklikleri işlemek için bir işleyici ekleme.
  • RecyclerView bağdaştırıcısı, yeni mesajların gösterileceği şekilde güncelleniyor.
  • Veritabanı örneği değişkenlerini, MainActivity sınıfındaki diğer Firebase örneği değişkenlerinizle birlikte ekleyin:

MainActivity.kt

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

Aşağıda tanımlanan kodla, // Initialize Realtime Database and FirebaseRecyclerAdapter yorumunun altında ana etkinliğinizin onCreate() yöntemini değiştirin. Bu kod, Realtime Database'deki mevcut tüm mesajları ekler ve Firebase Realtime Database'inizdeki messages yolunun altındaki yeni alt girişleri işler. Her mesaj için kullanıcı arayüzüne yeni bir öğe ekler:

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

Daha sonra, FriendlyMessageAdapter.kt sınıfında, MessageViewHolder() iç sınıfında bind() yöntemini uygulayın:

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

Ayrıca, resim olan mesajları göstermemiz gerekir. Bu nedenle, ImageMessageViewHolder() iç sınıfında bind() yöntemini de uygulayın:

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

Son olarak, MainActivity uygulamasına dönüp Firebase Realtime Database'den gelen güncellemeleri dinlemeye başlayın ve durdurun. MainActivity ürününde onPause() ve onResume() yöntemlerini aşağıda gösterildiği gibi güncelleyin:

MainActivity.kt

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

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

Mesaj senkronizasyonunu test etme

  1. Çalıştır'ı ( execute) tıklayın.
  2. Emulator Suite kullanıcı arayüzünde Realtime Database sekmesine dönüp manuel olarak yeni mesaj ekleyin. Mesajın Android uygulamanızda göründüğünü onaylayın:

Tebrikler, uygulamanıza gerçek zamanlı bir veritabanı eklediniz.

8. Mesajlar Gönderme

Kısa mesaj gönderme özelliğini uygulayın

Bu bölümde, uygulama kullanıcılarının kısa mesaj gönderme özelliğini ekleyeceksiniz. Aşağıdaki kod snippet'i, gönder düğmesindeki tıklama etkinliklerini dinler, mesaj alanının içeriğiyle yeni bir FriendlyMessage nesnesi oluşturur ve mesajı veritabanına aktarır. push() yöntemi, aktarılan nesnenin yoluna otomatik olarak oluşturulmuş bir kimlik ekler. Bu kimlikler sıralı olduğundan yeni iletilerin listenin sonuna eklenmesini sağlar.

MainActivity sınıfındaki onCreate() yönteminde gönder düğmesinin tıklama işleyicisini güncelleyin. Bu kod halihazırda onCreate() yönteminin altında bulunur. onClick() gövdesini aşağıdaki kodla eşleşecek şekilde güncelleyin:

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

Resimli mesaj gönderme özelliğini uygulayın

Bu bölümde, uygulama kullanıcıları için resim mesaj gönderme özelliği ekleyeceksiniz. Resimli mesaj oluşturma işlemi aşağıdaki adımları uygulayarak tamamlanır:

  • Resim seç
  • Resim seçimini işleme
  • Realtime Database'e geçici görüntü mesajı yazma
  • Seçili resmi yüklemeye başla
  • Yükleme işlemi tamamlandıktan sonra resim mesajı URL'sini, yüklenen resmin URL'siyle güncelle

Resim Seç

Bu codelab, görüntü eklemek için Firebase için Cloud Storage'ı kullanır. Cloud Storage, uygulamanızın ikili verilerini depolamak için iyi bir yerdir.

Resim seçimini işleme ve geçici mesaj yazma

Kullanıcı bir resim seçtikten sonra Intent resim seçimi başlatılır. Bu, onCreate() yönteminin sonundaki kodda zaten uygulanmıştır. İşlem tamamlandığında MainActivity öğesinin onImageSelected() yöntemi çağrılır. Aşağıdaki kod snippet'ini kullanarak veritabanına, resmin yüklenmekte olduğunu belirten geçici bir resim URL'si içeren bir mesaj yazacaksınız.

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

Resim yükle ve mesajı güncelle

MainActivity öğesine putImageInStorage() yöntemini ekleyin. Seçilen resmin yüklenmesini başlatmak için onImageSelected() içinde çağrılır. Yükleme tamamlandığında mesajı uygun resmi kullanacak şekilde güncellersiniz.

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

Mesaj göndermeyi test etme

  1. Android Studio'da executeÇalıştır düğmesini tıklayın.
  2. Android Emülatörünüzde, bir mesaj girin ve gönder düğmesine dokunun. Yeni mesaj, uygulamanın kullanıcı arayüzünde ve Firebase Emulator Suite kullanıcı arayüzünde görünür olmalıdır.
  3. Android Emülatör'de "+" simgesine dokunun. resmi seçin. Yeni mesaj önce bir yer tutucu resimle, ardından resim yükleme işlemi tamamlandığında seçilen resimle görünür olmalıdır. Yeni mesajın Emulator Suite kullanıcı arayüzünde de, özellikle Realtime Database sekmesinde nesne ve Storage sekmesinde blob olarak görünmesi gerekir.

9. Tebrikler!

Firebase'i kullanarak gerçek zamanlı bir sohbet uygulaması oluşturdunuz.

Öğrendikleriniz

  • Firebase Authentication
  • Firebase Realtime Database
  • Cloud Storage for Firebase

Ardından, bu codelab'de öğrendiklerinizi kullanarak Firebase'i kendi Android uygulamanıza eklemeyi deneyin. Firebase hakkında daha fazla bilgi edinmek için firebase.google.com adresini ziyaret edin.

Gerçek bir Firebase projesi oluşturmayı ve gerçek Firebase kaynaklarını (demo projesi ve yalnızca emülasyonlu kaynaklar yerine) kullanmayı öğrenmek istiyorsanız bir sonraki adıma geçin.

Not: Gerçek bir Firebase projesi oluşturduktan sonra ve özellikle gerçek bir uygulama oluşturmaya başladıktan sonra bile geliştirme ve test için Firebase Local Emulator Suite'i kullanmanızı öneririz.

10. İsteğe bağlı: Firebase projesi oluşturma ve ayarlama

Bu adımda, bu codelab ile kullanmak için gerçek bir Firebase projesi ve Firebase Android uygulaması oluşturacaksınız. Ayrıca, uygulamaya özel Firebase yapılandırmanızı de uygulamanıza eklersiniz. Son olarak da uygulamanızla kullanabileceğiniz gerçek Firebase kaynakları ayarlarsınız.

Firebase projesi oluşturma

  1. Tarayıcınızda Firebase konsoluna gidin.
  2. Proje ekle'yi seçin.
  3. Bir proje adı seçin veya girin. İstediğiniz adı kullanabilirsiniz.
  4. Bu codelab için Google Analytics'e ihtiyacınız yoktur. Bu nedenle projenizde Google Analytics'i etkinleştirme adımını atlayabilirsiniz.
  5. Proje Oluştur'u tıklayın. Projeniz hazır olduğunda Devam'ı tıklayın.

Firebase'i Android projenize ekleyin

Bu adıma başlamadan önce uygulamanızın SHA1 karmasını alın. Hata ayıklama anahtarınızın SHA1'ini belirlemek için yerel build-android-start dizininizde aşağıdaki komutu çalıştırı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

Yukarıdakine benzer bir çıkış almanız gerekir. Önemli satır, SHA1 karmasıdır. SHA1 karmanızı bulamıyorsanız daha fazla bilgi için bu sayfaya bakın.

Firebase konsoluna dönün ve Android projenizi Firebase projenize kaydetmek için aşağıdaki adımları uygulayın:

  1. Kurulum iş akışını başlatmak için yeni projenizin genel bakış ekranından Android simgesini tıklayın: android uygulaması ekle
  2. Sonraki ekranda, uygulamanızın paket adı olarak com.google.firebase.codelab.friendlychat yazın.
  3. Uygulamayı Kaydet'i, ardından Firebase yapılandırma dosyanızı indirmek için google-services.json'u indir'i tıklayın.
  4. google-services.json dosyasını Android projenizin app dizinine kopyalayın.
  5. Konsolun kurulum iş akışında gösterilen sonraki adımları atlayın (bu adımlar sizin için build-android-start projesinde zaten yapılmıştır).
  6. Projenizi Gradle dosyalarıyla senkronize ederek tüm bağımlılıkların uygulamanızda kullanılabildiğinden emin olun. Android Studio araç çubuğundan Dosya > Projeyi Gradle Dosyalarıyla senkronize edin. Yapılandırma değişikliklerinin uygulanması için Proje Derleme/Temizleme ve Projeyi Derle/Yeniden Oluştur işlemlerini de çalıştırmanız gerekebilir.

Firebase Authentication'ı yapılandırma

Uygulamanızın, kullanıcılarınız adına Firebase Authentication API'lerine erişebilmesi için Firebase Authentication'ı ve uygulamanızda kullanmak istediğiniz oturum açma sağlayıcılarını etkinleştirmeniz gerekir.

  1. Firebase konsolunda, sol taraftaki gezinme panelinden Kimlik Doğrulama'yı seçin.
  2. Oturum açma yöntemi sekmesini seçin.
  3. E-posta/Şifre'yi tıklayın ve anahtarı etkin (mavi) duruma getirin.
  4. Google'ı tıklayın, ardından anahtarı etkin (mavi) konumuna getirin ve bir proje destek e-postası ayarlayın.

Bu codelab'de daha sonra "CONFIGURATION_NOT_FOUND" mesajıyla hata mesajı alırsanız bu adıma dönüp çalışmanızı tekrar kontrol edin.

Realtime Database'i yapılandırma

Bu codelab'deki uygulama, sohbet mesajlarını Firebase Realtime Database'de depolar. Bu bölümde, bir veritabanı oluşturacağız ve Firebase Security Rules adı verilen bir JSON yapılandırma diliyle veritabanının güvenliğini yapılandıracağız.

  1. Firebase konsolunda, sol taraftaki gezinme panelinden Realtime Database'i seçin.
  2. Yeni bir Realtime Database örneği oluşturmak için Create Database'i (Veritabanı Oluştur) tıklayın. İstendiğinde us-central1 bölgesini seçip İleri'yi tıklayın.
  3. Güvenlik kuralları hakkında sorulduğunda kilitli mod'u seçin ve ardından Etkinleştir'i tıklayın.
  4. Veritabanı örneği oluşturulduktan sonra Kurallar sekmesini seçin ve kural yapılandırmasını aşağıdaki şekilde güncelleyin:
     {
       "rules": {
         "messages": {
           ".read": "auth.uid != null",
           ".write": "auth.uid != null"
         }
       }
     }
    

Güvenlik Kuralları'nın işleyiş şekli hakkında daha fazla bilgi edinmek için ("auth" değişkeniyle ilgili dokümanlar dahil), Gerçek Zamanlı Veritabanı güvenlik belgelerine göz atın.

Firebase için Cloud Storage'ı yapılandırma

  1. Firebase konsolunda, sol taraftaki gezinme panelinden Depolama'yı seçin.
  2. Projenizde Cloud Storage'ı etkinleştirmek için Başlayın'ı tıklayın.
  3. Önerilen varsayılan değerleri kullanarak paketinizi ayarlamak için iletişim kutusundaki adımları uygulayın.

Firebase kaynaklarına bağlanma

Bu codelab'in önceki adımlarından birinde MainActivity.kt öğesine aşağıdaki öğeleri eklediniz. Bu koşullu blok, Android projenizi Firebase Emulator Suite'e bağladı.

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

Uygulamanızı yeni gerçek Firebase projenize ve onun gerçek Firebase kaynaklarına bağlamak isterseniz bu engellemeyi kaldırabilir veya uygulamanızı sürüm modunda çalıştırarak BuildConfig.DEBUG'nin false olmasını sağlayabilirsiniz.