Yenilenen Firebase ile Login Olma, Veri Tabanı İşlemleri (Android için…)

Merhaba arkadaşlar.
Bir önceki yazıda da bahsettiğim gibi; bu makalede daha önce yapmış olduğumuz UOChat Android uygulamasını yenilenen Firebase kütüphanelerine göre uyarlayacağız. Ayrıca; uygulamaya kayıt olan kullanıcıların profil bilgilerini de alarak aslında basit bir sosyal mesajlaşma uygulaması oluşturmuş olacağız.

UOChat Android uygulaması hakkında hiç bir fikri olmayan arkadaşlar şu adrese bakabilir:  http://umutonur.com/android-programlama-ile-firebase-kullanimi/

Makale içerisinde;

  • FirebaseAuth kütüphanesi ile;
    • Email ve Şifre kullanarak kullanıcı oluşturma,
    • Email ve Şifre kullanarak login olma (yetkilendirme),
    • Oluşturulan kullanıcının Profil bilgilerini güncelleme ve kullanma
  • FirebaseDatabase kütüphanesi ile;
    • Veri tabanından veri okuma/ekleme/güncelleme/silme işlemleri,
    • Veri tabanındaki değişiklikleri dinleme
  • Secrutiy & Rules kuralları ile veri tabanı güvenliği

konularına değineceğim. Makalenin sonunda ise aşama aşama anlatmış olduğum Mesajlaşma uygulamasını tamamlayıp kaynak kodlarını sizinle paylaşacağım.

Kodlara geçmeden önce kısa bir hikaye kısmı olacaktır. Yenilenen Firebase platformunu daha iyi anlayabilmek açısından yararlı olacak bu bilgileri okumak istemeyen arkadaşlar bu kısmı atlayabilir 🙂

– Hikaye kısmının başlangıcı  :

Önceki Chat uygulamasından da hatırlayacaksınızdır..

Firebase eski sürümünde; Firebase‘i hangi activity üzerinde kullanacaksak o activity’nin onCreate() içerisinde Firebase.setAndroidContext() ile bunu belirtmemiz gerekiyordu. Yenilenen Firebase‘de ise buna ihtiyaç duyulmuyor. Uygulamanızdaki Firebase bağlantısını istediğiniz yerden kullanabilmeniz artık mümkün..

Firebase yenilenmeden önce; bir Firebase nesnesi oluştururken veri tabanımızın url adresini de belirtmemiz gerekiyordu. (Firebase firebase = new Firebase(“https://uochat.firebaseio.com/”) gibi..)
Yeni Firebase platformunu projemize dahil ederken proje dosyaları arasına “google-services.json” dosyasının da eklendiğini bir önceki makaleden hatırlayacaksınız. Yenilenen Firebase ile bize sunulmuş olan tüm Google Servislerini kullanabilmek için gerekli olan API Keyler, URL adresleri gibi bilgilerin bulunduğu bu dosya sayesinde artık Firebase nesnesi oluştururken her hangi bir url adresi belirtmemize de ihtiyaç kalmamıştır.

Yani; yazmakta olduğuuz uygulamayı Android Studio 2.2 ile yeni Firebase platformuna bağlarken aslında gerekli olan tüm bilgiler projemize entegre edilmiş oluyor.  Buda bir Android Uygulamasının sadece tek bir Firebase Uygulamasına bağlanabileceği,aynı anda birden fazla Firebase Uygulamasına bağlantının söz konusu olmayacağı anlamına geldiğini bize göstermektedir.

Ek olarak belirteyim:
Yeni Firebase; AndroidManifest.xml dosyasından alınan ve INTERNET kullanımı için gerekli olan;

iznine de ihtiyaç duymaz.

Google Servisleri ile daha bütünleşmiş bir yapıya kavuşan bu yeni Firebase platformunu emulator üzerinde denemek istiyorsak, o emülator’de Google Servislerininde kurulu olması gerekmektedir. (Uygulamayı telefonda denemek isteyenler için böyle bir durum söz konusu değil, çünkü telefonlarda bu servisler zaten yüklü durumdadır.)

Google Play Servislerini GenyMotion‘a yüklemek için şu linke tıklayabilirsiniz.

http://umutonur.com/genymotiona-google-play-services-kurulumu/

– Hikaye kısmının sonu..

Hikaye kısmını da hallettikten sonra uygulamayı oluşturmaya başlayabiliriz..

Uygulamamız; MainActivity, Profil ve Chat isimlerindeki 3 activity‘den oluşacaktır.

MainActivity :

Ekran Tasarımı:

MainActivity

2’şer adet EditText ve Button bileşenlerinden oluşan MainActivity tasarımında kullanıcı Email ve Şifresini yazıp “Kaydol” butonuna tıkladığında yeni bir kullanıcı oluşturulacaktır.
Eğer kullanıcı “Giriş” butonuna tıklarsa yazılan Email ve Şifre ile giriş yapılacak ve bilgiler doğru ise Profil sayfası açılacak.

Önceki sürümde tüm işlemleri tek bir Firebase sınıfı nesnesi üzerinden yapıyorduk.

Fakat yeni sürümde veri tabanı işlemleri için FirebaseDatabase, yetkilendirme (login) işlemleri için de FirebaseAuth sınıflarını kullanacağız. Bu sınıfların referans olduğu nesneleri tanımlarken getInstance() metodunu kullanıyoruz.

firebaseDatabase ve firebaseAuth nesnelerini yukarıdaki gibi tanımladıktan sonra EditText ve Button bileşenlerini de tanımlayarak kodlamaya devam ediyoruz..

Yeni bir kullanıcı oluşturmak için ise önce ki createUser() metodu yerine createUserWithEmailAndPassword() metodunu kullanıyoruz.
Bu metod createUserWithEmailAndPassword(“email adresi”,”şifre”) şeklinde 2 adet parametre almaktadır.
Kullanıcı oluşturma işlemi sırasında:
– İşlemin başarıyla gerçekleştiği durumda yapılacak işlemler için: OnSuccessListener
– Herhangi bir hata olduğunda yapılacak işlemler için: 
OnFailureListener
– Sonuç ne olursa olsun işlemin tamamlandığında yapılacak işlemler için: OnCompleteListener dinleyicisini kullanabiliriz.

Bu 3 dinleyiciyiden de bahsedeyim.

 

OnSuccessListener dinleyicisini eklerken createUserWithEmailAndPassword() metodu altındaki addOnSuccessListener() metodunu kullanıyoruz. Bu metod içerisinde ilk parametre olarak dinleyicinin çalışacağı activity‘i, ikinci parametre olarak ta OnSuccessListener dinleyicisini belirtiyoruz. Kullanıcı oluşturma işlemi başarılı olduğunda onSuccess() metodu içindeki işlemler gerçekleşir.

OnFailureListener dinleyicisini eklerken de addOnFailureListener() metodunu kullanıyoruz.

Bu iki dinleyiciyi aynı kod bloğu içerisinde ayrı ayrı nesnelerde kullanabilmemiz mümkün değildir. Ya örnekteki gibi ikisini aynı anda ekleyebiliriz, yada sadece 1 tanesini kullanabiliriz.

Bu iki dinleyicinin şuan yaptığı işi sadece OnCompleteListener kullanarak yapabiliriz.

Kullanıcı oluşturma işlemi sona erdiğinde;
eğer işlem başarıyla gerçekleşmiş ise task.isSuccessful() metodu true olarak geri dönecek; kullaniciOlustur() ve kullaniciGuncele() metodları çalışacaktır.
eğer bir hatadan dolayı işlem iptal olmuş ise task.isSuccessful() metodu false olarak geri dönecektir.Bu durumda task.getException().getMessage() metodunun geri dönüş değeri olarak gerçekleşen hata mesajı Logcat ekranında yazdırılacaktır.

Şimdi yine OnCompleteListener dinleyicisini kullanarak sisteme nasıl login olunacağına bakalım.

Firebase platformunda Email ve Şifre ile yetki sahibi olabilmek yani login olabilmek için signInWithEmailAndPassword(“email”, “şifre”) metodunu kullanıyoruz. Kullanıcı oluştururken kullanabildiğimiz OnSuccessListener ve OnFailureListener dinleyicileri de yine bu metod için kullanılabilir.

Yukarıdaki kodda, giriş başarılı olduğu takdirde task.isSuccessful() metodu true dönecek ve Profil isimli activity açılacak. Eğer işlem herhangi bir hatadan dolayı iptal olursa task.getException.getMessage() metodunda geri dönen hata mesajı Logcat ekranında yazdırılacaktır.

Kullanıcı oluşturma ve login işlemlerini hallettikten sonra sıra geldi kullanıcı profili güncellemeye..

Yeni Firebase platformunda oluşturulan her kullanıcı için FirebaseUser sınıfından türetilen bir profil oluşturulur. Bu profilde kullanıcıya ait bazı bilgiler saklanabilir.
Saklanabilen bu bilgiler ve bunlara erişmemizi sağlayan metodlar şu şekildedir :

  • Email : getEmail(), updateEmail()
  • Şifre : updatePassword()
  • Görünür Ad : getDisplayName() , setDisplayName()
  • Profil Resmi Adresi : getPhotoUrl(), setPhotoUrl()
  • Kullanıcı ID : getUid()

Bu profil bilgileri get metodlarıyla sistemden çekilir, set ve update metodlarıylada değerleri değiştirilir. Biz bu uygulamamızda Görünür Ad yani DisplayName özelliğini kullanarak sohbet uygulamamızda kullanacağımız takma adımızı bu özellik altında saklayacağız.

Var olan bir kullanıcının bilgilerini FirebaseUser sınıfından güncelleyebiliyoruz. updateProfile() metoduyla güncelleme yaparken UserProfileChangeRequest sınıfını parametre olarak girmeliyiz. UserProfileChangeRequest sınıfı kullanarak sadece DisplayName ve PhotoUri özelliklerini değiştirebiliriz.

Kullanıcı oluşturma ve login işleminde olduğu bu metodta da aynı OnSuccessListener, OnFailureListener ve OnCompleteListener dinleyicilerini kullanabiliyoruz.

Ben yaptığım örnekte; eğer güncelleme işlemi sırasında bir hata oluşursa bunu Logcat ekranına yazdıran, ve sonuç ne olursa olsun işlemin sonucunda Profil activity‘i açan bir kod yazdım. Siz farklı işlemlerde yaptırabilirsiniz..

Peki…
Bir kullanıcı profilinde daha fazla bilgi (ad, soyad, telefon numarası v.b.) saklamak istersek nasıl bir yöntem izlemeliyiz?

Gördüğünüz gibi FirebaseUser bünyesinde saklayabildiğimiz bilgiler sınırlı.. Bu durumda bize kalan tek seçenek, saklamak istediğimiz diğer bilgileri veri tabanında tutmak olacaktır.

Veri tabanını içerisinde birçok verinin var olacağını düşünürsek, her kullanıcının bilgilerine kolay bir şekilde erişebilmemiz için bu bilgileri belli bir sisteme göre saklamamız gerekir.

Ben bu bilgileri, “users” child’ı altında her Kullanıcının ID‘si içerisinde ayrı ayrı tutarak şu şekilde saklayacağım.

users :

1. Kullanıcının ID’si :

Kullanıcı Adı
Kullanıcı Soyadı

2. Kullanıcının ID’si :

Kullanıcı Adı
Kullanıcı Soyadı

 

Yani veri tabanımızda bu veriler şu şekilde görünecek;

user ornek

Kişisel bilgileri ekledikten sonra bunların güvenliğini sağlayabilmekte oldukça önemlidir. Tercih ettiğimiz bu yöntemle kullanıcıların Ad ve Soyad bilgilerini veri tabanı içerisinde saklamaktayız.Bu durum veri tabanına erişebilen herkesin; yani Email ve Şifre ile (yada başka bir yöntemle) sisteme yetkili olarak giriş yapan her kullanıcının diğer kullanıcıların bilgilerini de görebileceği, bu bilgiler üzerinde değişiklik yapabileceği anlamına gelmektedir.

Bu durumu engellemek için Security & Rules kodlarında düzenleme yapmamız gerekmektedir.

Bu düzenlemeleri yapabilmek için Realtime Database kısmındaki RULES sekmesine tıkladığımızda karşımıza bir kod sayfası çıkacaktır.

Buradaki kodları şu şekilde düzenleyip PUBLISH butonuna tıklıyoruz:

Bu kuralların ayrıntısına şuan girmeyeceğim, yoksa bu makalenin sonu gelmez 🙂
Fakat kodların ne işe yaradığını açıklayayım. Bu kodlar veri tabanına dışardan birinin erişimini engelliyor. Yani herhangi bir yöntemle login olmayanlar veri tabanındaki verilere erişemezler.
Ayrıca “users” child’ının altında bulunan kullanıcı bilgilerine sadece o bilgilerin sahibi olan kullanıcılar erişebilir. Yani herhangi bir kullanıcı, başka bir kullanıcının bilgilerini göremez ve değiştiremez.

Kullanıcı Bilgilerini Veri Tabanına Kaydetme : 

Önceki Firebase sürümünde veri tabanına bilgi eklerken setValue() metodunu kullanıyorduk. Yeni sürümde de aynı metod kullanılmakta.
Fakat yeni sürümde; veri tabanı işlemleri FirebaseDatabase kütüphanesinde bununan DatabaseReference sınıfından türetilen bir nesne ile yapılaktadır.

Kodda ilk olarak ad ve soyad anahtarlarından oluşan yeniUser adında bir Map nesnesi oluşturuyor.
Daha sonra firebaseDatabase‘den bir DatabaseReference nesnesi türetiliyor.
Bu referans nesnesi ile “users” child’ının altında yukarıdaki resimde olduğu gibi Kullanıcı ID‘si isminde bir child daha oluşturulup Map nesnesindeki bilgiler setValue() metodu ile veri tabanına yazılıyor.

İstersek bu isleme de OnCompleteListener eklememiz mümkündür. Ki profesyonelce yazılan bir uygulamada bence böyle bir dinleyici de eklenmelidir. Çünkü böyle bir uygulamada, veri tabanına bilgi yazılırken oluşabilecek herhangi bir hatanın önlemi alınması gerekir. Aksi takdirde ilerleyen süreçte uygulamanın çalışmasını engelleyecek derece olumsuz sonuçlar ortaya çıkabilir.

Fakat ben örnek bir uygulama yaptığım için bu dinleyiciyi eklemiyorum 🙂

Profil :

Ekran Tasarımı :

Firebase Profil Olusturma

ve hemen kodlamaya başlayalım.

FirebaseAuth ve FirebaseDatabase nesnelerini tanımlıyoruz.

FirebaseAuth ile login olduğumuz kullanıcının ID‘sini alacağız. Kullanıcı bilgileri (Ad ve Soyad) ID‘nin içinde saklandığı için bu ID‘yi almamız gerekiyor.

FirebaseDatabase ile veri tabanındaki kullanıcı bilgilerine erişeceğiz.

DatabaseReference nesnemizi “users” altındaki Kullanıcı ID değerine referans olacak şekilde oluşturuyoruz. Yani kullanıcı ID‘sinin abc123 olduğunu varsayarsak, databaseReference nesnesi ile yapılacak her işlem; veri tabanı içerisinde “users” altındaki “abc123” child’ı altında gerçekleşecektir.

Bu dataReference nesnesinin referans olduğu child içerisindeki değişiklikleri izleyebilmek için bu nesneye bir ValueEventListener dinleyicisi eklemeliyiz. Bunu da addListenerForSingleValuEvent() metodunu kullanarak yapıyoruz.

onDataChange() metodu “users” altındaki; kullanıcı ID‘nin eşit olduğu (abc123 olduğunu varsaydığımız değer) child içerisinde değişiklik olduğu zaman yapılacak olan işlemleri kapsamaktadır.
Burada ilk olarak child içerisindeki “ad” ve “soyad” anahtarlarının değerlerini getValue() ile dinleyiciden alıyoruz.
firebaseUser nesnesi ile getNameDisplay() metodunu kullanarak rumuzu da alıp  String değişkenlerine aktarıyoruz.
Daha sonra bu değişkenleri EditText’lere yazdırıyoruz.

Ben yaptığım layout tasarımında EditText bileşenlerinin Enable özelliğini başlangıçta false olarak ayarladığım için bu değerleri setEnabled() ile değiştiriyorum.

onCancelled() metodu da child dinlenirken herhangi bir hata oluşursa harekete geçer. (Mesela başka bir kullanıcının verilerine oluşmak istersek bu metod harekete geçer.)

“Sohbete Gir” butonuna tıkladığımızda sırasıyla;
Veritabanındaki “ad” değerine ad isimli EditText‘in içindeki değeri, “soyad” değerine soyad isimli EditText‘in içindeki değeri veri tabanına yazıyoruz. Sonra da DisplayName özelliğini setDisplayName() metodu kullanarak update ediyoruz.
Son olarak ta Chat sayfasını açıyoruz..

Çıkış butonuna signOut() metoduyla logout yapıp uygulamayı kapatıyoruz.

Chat :

Ekran Tasarımı

firebase chat sayfası

ListView, EditText ve ImageView‘den oluşan activity‘de veri tabanındaki “Mesajlar” child’ının altındaki veriler dinleyici sayesinde ListView‘e eklenecek.
ImageView‘e tıklayınca da TextView‘de yazan yazı “Mesajlar” child’ına kullanıcının rumuzu ile birlikte yazılacak. Ve sonunda bir sohbet uygulaması oluşturmuş olacağız.

Firebase nesnelerini ve görsel bileşenleri tanımlıyoruz..

Daha sonra ArrayAdapter, DatabaseReference ve FirebaseUser nesnelerini tanımlayıp, DisplayName özelliğini rumuz değişkenine aktarıyoruz.

reference nesnesine bir ChildEventListener dinleyicisi ekliyoruz.  Bu dinleyici sayesinde “Mesajlar” child’ına eklenen her mesaj’ın listeye eklenmesini sağlayacağız.

Son olarakta mesajı yollama kısmına geçelim.

Burada setValue() ile birlikte push() metodunuda kullanıyoruz. Bu sayede yazdıklarımız “Mesajlar” child’ına dizi şeklinde eklenecektir.

mesaj.setText(“”) metoduyla da EditText‘i temizliyoruz.

ve uygulama burada sonlanıyor..

Bu makalede hikaye kısmı biraz fazla oldu kusura bakmayın. Sıkılmış olabilirsiniz ama gerekli olan tüm detayları en genel ve en anlaşılır şekilde anlaymaya çalıştım.

Neyse uzatmayalım.. 🙂

Projenin kaynak kodlarına aşağıdaki linkten ulaşabilirsiniz..

https://github.com/umon/new-firebase-example-uochat

Siteye abone olmadıysanız, olabilirsiniz.. Buna kesinlikle karşı çıkmayacağım 🙂
Happy Codings..




You may also like...

16 Responses

  1. admgnr dedi ki:

    Cok net anlatmışsınız. Devamını bekliyoruz.

  2. Mevlüt dedi ki:

    Eyvallah guzelce yazılmış Ender Türkçe kaynaklardan

  3. Umut ONUR dedi ki:

    Teşekkürler..

  4. Baran Karaoguz dedi ki:

    Hocam yine ben tekrar ellerine sağlık bitirme odevimi yaklasık 20 gün önce teslim ettim yardımların için teşekkür ederim ama yine sana bir sorum olucak ben eğer e-mail verification yani doğrulama için link yollamak istersem firebasein e-mail templates diye bir olayı var ama daha androide gelmemiş anladığım kadarıyla web ve ios ta kullanılıyor bunun hakkında bir bilgin var mı?

  5. Anonim dedi ki:

    Adamsin reiss 🙂

  6. Sertaç dedi ki:

    Hocam elinize sağlık. Firebase e girince ya yeni proje yap ya da google projenin ekle secenegi var. Ama netbeans ile hazırladığım android uygulamaya, bu fireball login olayını nasıl ekleyebilirim anlayamadım. Bir yol gösterebilirmisiniz, çok teşekkürler.

    • Umut ONUR dedi ki:

      Merhaba Sertaç. NetBeans üzerinde hiç Firebase kullanmadım. Ama bildiğim kadarıyla yardımcı olacağım.
      Firebase Console üzerindeki projeyi açtığınızda;
      Sol taraftaki menünün üst kısmından “Project settings” e girerek google-services.json dosyasını indirebiliyorsunuz.
      Bu json dosyasını uygulamana ekledikten sonra http://search.maven.org/#search%7Cga%7C1%7Cfirebase%20sdk adresinden .jar kütüphanesini indirip uygulamana eklersen Firebase’i kullanabilirsin.

      Ama bence NetBeans ile vakit kaybetme, Android Studio’ya geç 🙂

  7. Burak dedi ki:

    Ellerine sağlık dostum.

  8. friend77 dedi ki:

    Merhaba,
    Projeyi Android studio ile açıp çalıştırdığımda cihazımda açılıyor ancak e-mail ve şifre ile kayıt butonuna bastığımda UOChat2 durduruldu hatası alıyorum nedeni hakkında yardımcı olabilir misiniz? (Android 6.0.1)

  9. Anonim dedi ki:

    Kaydol butonuna tıkladığımda uygulama neden durduruldu hatası veriyor?

    • Umut ONUR dedi ki:

      Merhabalar..Kaynak kod içerisinde dikkatsizlikten ötürü oluşmuş bir hata vardı. Düzelttim, artık düzgün çalışıyor 🙂

      Hatanın sebebi de şudur;
      MainActivity.java içerisinde :

      kayit.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
      String emailAddr = email.getText().toString();
      String pass = password.getText().toString();
      firebaseAuth.createUserWithEmailAndPassword(emailAddr, pass)…

      yazmak yerine

      kayit.setOnClickListener(new View.OnClickListener() {
      String emailAddr = email.getText().toString();
      String pass = password.getText().toString();
      @Override
      public void onClick(View v) {
      firebaseAuth.createUserWithEmailAndPassword(emailAddr, pass)…

      şeklinde emailAddr ve pass string’lerinin değerlerini onClick() dışında tanımladığımdan ötürü,program email ve password değerlerini alamadığı için hata meydana gelmektedir.

  10. Fatih Demir dedi ki:

    Uzun zamandır bu kadar besleyici bir makale okumamıştım. Artık takipçinizim

  11. Smyy dedi ki:

    Helal olsun valla harika olmuş
    Emeğine yüreğine sağlık

  12. Kerem dedi ki:

    Keşke yaptığın konularla ilgili youtube a video koysan

Bir Cevap Yazın