Android Programlama ile Firebase Kullanımı

Merhaba Arkadaşlar.
Bir önceki makalede Java Programlama Dili kullanarak giriş yaptığımız Firebase Chat Uygulamasını Android Platformu içerisinde daha da geliştirerek devam edeceğim.

  • Önceki makalede addValueEventListener() isimli veri tabanı dinleyicisini inceledik,
  • Custom Token‘ları kullanarak veri tabanı üzerinde yetkilendirme işlemini uyguladık,
  • Veri tabanı üzerinde okuma, yazma ve silme metodları hakkında bilgi verdik.

Bu makalede ise konuyla ilgili daha da ayrıntıya girerek;

  • addChildEventListener() isimli dinleyici ile veri tabanı içerisindeki belirli bir child() nesnesini dinleme,
  • push() metodu kullanarak belirli bir child()‘a veri ekleme (liste şeklinde),
  • Sistemimize Email & Password ile kullanıcı ekleyip bu kullanıcı bilgileriyle  yetkilendirme,
  • DataSnapshot sınıfı ile anlık veri tabanı okuma işlemleri hakkında bilgi vereceğim.

Bütün bu anlatacaklarım ışığında yazacağımız Android Uygulamasında;

İlk olarak bir Login Sayfası oluşturup,sisteme eklenmiş olan Kullanıcıdan Email adresi ve şifreyi girmesini isteyeceğiz.
Girilen bilgiler doğru ise Kullanıcı Sohbet sayfasına yönlendirilecek ve burada diğer kullanıcılarla sohbet edebilecektir.
Kullanıcıların yazdığı her mesaj, “Mesajlar” child‘ının altına ayrıntılı olarak eklenecektir.

Kodlamaya geçmeden önce Firebase veri tabanında Login & Auth bölümünden Email & Password özelliğini (Enable Email & Password Authentication) aktif etmemiz gerekiyor.
Daha sonra, veri tabanına eklediğimiz kullanıcılar haricinde başka birinin erişimini engellemek için Security & Rules kısmını da şu şekilde düzenliyoruz.

Belirlediğimiz bu güvenlik kuralına göre, “Mesajlar” child‘ı altındaki verilere sadece Email ve Şifre girerek yetki alan kullanıcılar erişim sağlayabilmektedir.

provider kavramından da biraz bahsedecek olursak;

Daha önceki makalemizde Kullanıcıların Custom Token kullanarak yetkilendirilmesinin yanında, veri tabanına eklenen Email ve Şifrelerle; yada Facebook, Twitter, Google, Github hesaplarıyla giriş yaparak ta yetkilendirilebildiğini söylemiştik.
İşte bu Login çeşitliliği provider anahtarı altında toplanmıştır. Türkçe anlamı sağlayıcı olan bu provider özelliği; Kullanıcının kullandığı yetkilendirme çeşidine göre değer almaktadır.

Yani kullanıcı Email ve Şifre ile yetkilendirme yapmışsa bu değer ‘password’,
Facebook hesabıyla yetkilendirme yapmışsa bu değer ‘facebook’,
Twitter hesabıyla yetkilendirme yapmışsa bu değer ‘twitter’,
Google hesabıyla yetkilendirme yapmışsa bu değer ‘google’,
Github hesabıyla yetkilendirme yapmışsa bu değer ‘github’ olarak değişmektedir.

Veri tabanına Email ve Şifre ile www.firebase.com‘dan kullanıcı eklemekte oldukça basittir. Bunun için Email & Password sayfasının alt kısmında Add User butonunu kullanarak bu işlemi gerçekleştirebilirsiniz. Ayrıca Android veya Java Programı (yada Swift) içinde de kullanıcı oluşturabilirsiniz. Bununla ilgili de birazdan kısa bir bilgi vereceğim.

Dilerseniz artık başlayalım.. 🙂

İlk olarak boş bir Android projesi oluşturuyoruz.

Daha sonra build.gradle (app) dosyasına şu eklemeleri yapıyoruz.

Değişiklikleri gerçekleştirdikten sonra Firabase Kütüphanesi kullanıma hazır hale gelecektir.

AndroidManifest.xml’den INTERNET iznini de almayı unutmalaylım 🙂

Gerekli kütüphaneleri ve izin işlemini hallettikten sonra;

Uygulumamızın adresi olan https://uochat.firebaseio.com/ adresine bağlanmak üzere bir Firebase nesnesini oluştururken

Firebase.setAndroidContext() ile Firebase nesnesinin çalışacağı Context‘i belirlememiz gerekmektedir. Aksi takdirde Firebase nesnesi çalışmayacaktır.

Ben Android Uygulaması üzerinden Email Adresi : abc@umutonur.com ve Şifresi : 123456 olan yeni bir kullanıcı oluşturacağım.

 

Program üzerinden Kullanıcı oluşturmak için createUser() metodunu kullanıyoruz. Bu metod içerisinde Override edilen onSuccess() metodu kullanıcı oluşturulduğunda harekete geçmektedir. Eğer herhangi bir hatayla karşılaşılırsa (Mesela belirtilen Email adresiyle daha önceden başka bir kullanıcı oluşturulmuşsa) onError() metodu harekete geçecektir.

createUser() metodunun yanı sıra;

Kullanıcı silmek için : removeUser()
Kullanıcı Email Adresi değiştirmek için : changeEmail()
Emaili belirtilen kullanıcı şifresini değiştirmek için : changePassword()
ve Kullanıcı şifresi sıfırlamak için : resetPassword() metodları kullanılmaktadır.

(Detaylı bilgi için: https://www.firebase.com/docs/android/guide/login/password.html)

Program üzerinden yapabildiğimiz bu kullanıcı işlemlerini Firebase web sitesi üzerindeki Email & Password sayfasından da yapabilmemiz mümkündür.

Şimdi de kullanıcımızı oluşturduğunuza göre sisteme nasıl  Login olacağımıza bir bakalım:

Email ve Şifre ile login olmak için authWithPassword() metodunu kullanıyoruz. Burda da giriş başarılı ise onAuthenticated() metodu, eğer giriş başarısız ise onAuthenticationError() metodu harekete geçmektedir.

Login işlemini de bu şekilde hallettiğimize göre artık veri tabanına mesaj gönderme işlemine geçebiliriz.

 

Bir önceki makalede, ilgili child‘ın değerini setValue() metoduyla değiştirmiştik. Bu uygulamada ise yazılan tüm mesajları “Mesajlar” isimli child‘ın altına dizi şeklinde ekleyeceğiz. Bu yüzden setValue() metodunu push() metodu ile birlikte kullanmak durumundayız.

Yani setValue(“yeni değer”) metodu tek başına kullanıldığında belirtilen child‘ın değerini değiştirmektedir. Fakat push().setValue(“yeni değer”) şekilde birlikte kullanıldıklarında setValue() içine girilen “yeni değer” i belirtilen child‘ın altına eklemektedir.

Örneklendirecek olursak :

yaptığımızda sonuç :

push

 

Resimde de gördüğünüz gibi sadece setValue() kullanıldığında direk o child‘ın (“Mesajlar 1”) değeri değişmiştir, ve son setValue() ‘deki “ikinci mesaj” değerini almıştır.

Fakat push().setValue() şeklinde kullandığımızda girdiğimiz değerleri Unique (benzersiz, tek) bir anahtar değeri ile “Mesaj 2”  isimli child‘ın altına liste şeklinde eklemiştir.
Yapmakta olduğumuz chat uygulamasında bizde aynı yöntemi kullanarak; gönderilen mesajların, “Mesajlar” isimli child‘ın altında bu şekilde listelenerek saklanmasını sağlayacağız.

Peki veri tabanına her hangi biri mesaj eklediğinde, biz bu olaydan nasıl haberdar olacağız?

Bir önceki makalede addValueEventListener() isimli veri tabanı dinleyicisini kullanmıştık. Bu dinleyici; veri tabanında her hangi bir değişiklik olduğunda harekete geçerek veri tabanının güncel halini bize göstermektedir.

Fakat şuan ki yazdığımız uygulamada durum biraz farklı..
Uygulamanın sohbet sayfasından yolladığımız mesajlar sadece veri tabanı içerisindeki “Mesajlar” isimli child‘ın altına eklenmektedir. Yani bizi ilgilendiren tek bir kısım var, oda “Mesajlar” kısmı..
Veri tabanının diğer kısımlarında yapılan değişiklikler ile ilgilenmediğimiz için veri tabanının tamamını dinlemeye gerek yok.

Bu sebepten dolayı addValueEventListener() dinleyicisi yerine  addChildEventListener() dinleyicisini kullanacağız.. addChildEventListener() dinleyicisi sadece belirli bir child‘ı dinler ve o child altına herhangi bir değişiklik yapıldığında harekete geçerek, yapılan değişiklerden haberdar olmamızı sağlar.

ChildEventListener dinleyicisi içerisindeki :

onChildAdded() metodu; dinlediğimiz kısma yeni bir veri eklendiğinde,
onChildChanged() metodu; dinlediğimiz kısımda bir değişiklik yapıldığında,
onChildMoved() metodu; dinlediğimiz kısımda bir taşıma işlemi yapıldığında,
onChildRemoved() metodu; dinlediğimiz kısımda bir silme işlemi yapıldığında,
onCancelled() metodu da; dinlediğimiz kısımda yapmaya çalıştığımız herhangi bir işlemin çeşitli sebeplerden dolayı (Örneğin Security & Rules ile belirtilen güvenlik kuralları nedeniyle) sunucu tarafından iptal edildiği zaman harekete geçmektedir.

Bazı metodların içerisinde 2. parametre olarak verilen String tipindeki s değeri bize sıralama olarak bir üstteki (yani bir önceki) elemanın anahtar ismini vermektedir.

Metodlar içerisinde ki parametlerden biri olan DataSnapshot sınıfı veri tabanından anlık veri almamızı sağlamaktadır.

Bu kadar açıklamadan sonra artık uygulamayı toparlamaya başlayalım..

Login Ekranı  :

UOChat Login Ekranı Firebase

Basit ve anlaşılır olması açısından; 3 adet EditText ve 2 adet Button bileşenlerinden oluşan Login Ekranı tasarladım.
Kayıt butonuna tıklandığında : EditText‘lerde belirttiğimiz Email ve Şifre ile veri tabanına kayıt yapılmaktadır. (createUser() metodu ile)

Giriş butonuna tıklandığında : EditText‘lerde belirtilen Email ve Şifre ile veri tabanına (authWithPassword() metodu ile) bağlanıp, belirttiğimiz Rumuz’da Chat sayfasına yollanmaktadır.

Kodlamaya başlayalım..

ilk olarak Firebase nesnesini ve görsel bileşenlerin nesnelerini oluşturuyoruz. Burada Firebase nesnesine Chat sınıfından direkt olarak erişebilmek için public static olarak tanımladım.

Görsel bileşenleri de yukarıdaki şekilde oluşturduk. Bunlara göre:

Giriş veya Kayıt butonlarına tıklandığında; sırasıyla login() veya kullaniciEkle() metodları çalışacaktır.

putExtra() metodu ile Rumuz kısmına yazılan takma adı Intent nesnesine yüklüyoruz. Chat sayfası açıldığında bu takma adı Intent nesnesinden geri alacağız.

Google’da “android intent ile veri taşıma” şeklinde aratırsanız konuyla ilgili detaylı bilgiye erişebilirsiniz.

Sohbet Ekranı :

Firebase Screen

Burada ListView, EditText ve ImageView bileşenlerinden oluşan sohbet ekranından yazdığımız mesajları veri tabanına gönderip, veri tabanına eklenen mesajları ListView içerisinde görüntülenmesini sağlayacağız.

setAndroidContext() ile bu sınıftan Firabase‘ye bağlanacağımızı belirttikten sonra firebase2 nesnesine ManActivity‘deki firebase nesnesini atıyoruz. (public static tanımlamasını bu yüzden yapmıştık.)

Sonrasında ise MainActivity‘de Intent nesnesine “takma ad” anahtarıyla yüklediğimiz rumuz değerini getIntent().getStringExtra() metoduyla çağırıp String tipindeki takmaAd nesnesine atıyoruz.

Bu kısımda; ImageView nesnesine tıklandığında, EditText‘e yazdığımız yazı takma adımızla birlikte “Mesajlar” child’ının altına ekleniyor, ve EditText içindeki yazı siliniyor.

Son olarak “Mesajlar” altına eklenen verileri takip edebilmek için bir ChildEventListener dinleyicisi ekliyoruz.

Eklediğimiz dinleyici, her veri eklendiğinde; eklenen verinin ListView nesnesinde görünmesini sağlıyor.

Böylece basit bir Chat uygulamasını oluşturmuş oluyoruz.

Kaynak Kodların tamamına :
https://github.com/umon/firebase-uochat adresinden ulaşabilir, uygulamaya eklemeler yapabilirsiniz..

Bir sonraki yazıda Swift Programlama Dili ile Firebase’in nasıl kullanıldığı hakkında bilgi vereceğim.
Bundan sonraki anlatımlarım genel anlamda Swift ağırlıklı olacaktır.

Takip etmek isteyen arkadaşlar siteye abone olabilirler.. 😉




You may also like...

13 Responses

  1. Baran dedi ki:

    Hocam senin sayende bitirme ödevimi yapabileceğim galiba ellerine sağlık çok başarılı olmuş.Ama bir kaç sorum var kaydol kısmında sadece e-mail ve şifre değilde başka özelliklerde tutsak ve bunları profilim sayfasında çekmek istesek örneğin şehir gsm gibi veritabanımızı nasıl şekillendirmemiz gerekiyor yardımcı olabilirmisin tekrar ellerine sağlık

    • Umut ONUR dedi ki:

      Merhaba Baran.
      Bu makalede anlattığım Android Uygulamasını yeni Firebase’e göre tekrar düzenleyip önümüzdeki günlerde yayınlamayı düşünüyorum. Bahsettiğin konuya da yayınlayacağım yeni makalede değineceğim. Umarım bitirme ödevine yetişir. 🙂

  2. Baran dedi ki:

    Teşekkür ettim takipte bekliyorum 🙂

  3. Sertaç dedi ki:

    Hocam öncelikle makaleleriniz için ellerinize sağlık. Ben bu projenizdeki firebase linkini degistirerek birebir denedim ama kullanıcı girişi yada kaydı hiç yapamadım. .Firebase de emeal aut.enable yaptım. Rules kısmına aynen ekledim. Ayıca edindiğim diğer bilgilere göre json dosyası ve google servise plugin ekleyerek de denedim ancak sonuç değişmedi. Aceba neyi gözden kaçırıyorum. Yardımcı olabilirseniz çok sevinirim. Saygılar.

    • Umut ONUR dedi ki:

      Merhaba Sertaç.
      Öncelikle bu makalede anlattıklarım Firebase’in önceki versiyonu için geçerlidir. Önceki version için json dosyası eklemene gerek yok.
      Eğer Firebase’in yeni versiyonu için sitesinden proje oluşturup; burada anlatılanlara göre işlemlerini yapıyorsan uygulamanın çalışmama durumu söz konusu olabilir.

      Yeni Firebase versiyonundaki işlemler için buradan başlayarak makaleleri takip edebilirsin :
      http://umutonur.com/android-studio-2-2-ve-yenilenen-firebase-kullanimi/

  4. Sertaç dedi ki:

    Umut hocam çok teşekkürler tekrar düzenleyince oldu. Ayrıca tamamen android studioya geçtim önerinizle. Hocam iki şey daha sorsam:)
    1- Bu email verification özelliği firebase console da var ancak nasıl aktifliyoruz yada farklı bir kullanımı mı mevcut aceba.
    2 – Uygulamam sqlite veritabanı kullanıyor ve db telefonda saklı dogal olarak. Bunu firebase veritabanına senkronize mi etmek gerek yoksa tamamen oraya taşımanın bir yolu varmı.(tabi bu tüm uygulama kodlarımın degistirmemi gerekirir dimi, bir sürü query kod kullanıyorum) Ne önerirsiniz ve nasıl yapabilirim. çok teşekkürler.

    • Umut ONUR dedi ki:

      Email verification işlemi ile ilgili önümüzdeki günlerde kısa bir anlatım yayınlamayı düşünüyorum. takipte kal 🙂

      2. soruna gelecek olursak; sqlite veri tabanı kullanıyorsan eğer, verilerini Firebase’den çekip daha sonra da sqlite üzerinde güncellemen gerekmektedir. İki veri tabanı tipi birbirinden çok farklı olduğu için, bu sana ekstra işlem yükü getirecektir. Dolayısıyla da büyük bir veri tabanıyla çalışıyorsan uygulamanın performansını da düşürecektir..

      Benim şahsi fikrim; tıpkı Firebase üzerinde olduğu gibi uygulama içerisinde de JSON veri tabanı kullanmandan yanadır. Nasıl bir .sqlite dosyasına SQL veri tabanını kaydediyorsan, aynı mantıkla bir .json dosyasına da JSON veri tabanını kaydedebilirsin.

      Performans bakımından JSON veri tabanı senin için daha hızlı olacaktır. Firebase veri tabanıda JSON tipinde olduğu için ekstra işlem yükünü de azaltır. JSON veri tabanının kullanılabilirliğini düşündüğümüz zaman ben her türlü SQL veri tabanından üstün olduğunu düşünüyorum. 🙂

  5. Sertaç dedi ki:

    Teşekkürler hocam, verification makalenizi bekliyorum, saygılar.

    • Umut ONUR dedi ki:

      Yanlız söylemeyi unuttum kusura bakma..
      Yayınlayacağım makale Swift ve Web için Email Verification işlemlerini kapsayacak..

      Çünkü Firebase üzerinde Android için Email Verification’u hala mevcut değil.. Servis sadece iOS ve Web uygulamaları için kullanılmakta.

  6. Sertaç dedi ki:

    Evet hocam android için verification henüz yok yazıyor. Google un androidi iphone un gerisinde tutması ilginç. Belki alternatif bir çözüm bulunabilir diye düşünüyorum. web için olan yazınızı bekliyorum. teşekkürler.

  7. Sertaç dedi ki:

    Umut hocam yazınız çıkmadan önce katkıda bulunmak adına 2 soru sorabilirmiyim :

    1 – Firebase ile web sitesi yaparken: apikey i barındıran script kodu ortada, kullanıcı bu kod ile bir anda milyarlarca kullanıcı oluşturabilir. Buna önlem nedir aceba? Verification sanırım ? verification yapmayan bir süre sonra siliniyormu.? Bu kurallara nasıl eklenir ?
    2 – Verification yapan bir kullanıcıda yine bu kod ile firebase storage içine milyonlarca dosya upload yada gelişi güzel dosya silebilir.

    Ben tüm aramalarıma ragmen bunlara yanıt bulamadım. Json kodları ile js kodlarının oldugu dosyayı yöneldirdim bu kez çalışmadı. js kodu şifreledim bukez antivirüs programları sorun oldu.

    Yazınızın ve yardımlarınızı dört gözle bekliyorum, teşekkürler.

  8. sefer yazıcı dedi ki:

    Merhabalar Umut bey Firebase e Login durumda olan tüm userları nasıl sorgulayıp bir listede gösterebiliriz. Ve ayrıca uygulamayı kapatıp çıkış yapan userları tespit edip listeden nasıl silebiliriz. Yani uygulamamızda şuanda kimler aktif buna bir örnek vermeniz mümkünmüdür

  1. Haziran 8, 2016

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

Bir Cevap Yazın