Android Firebase Chat Uygulaması

Merhaba arkadaşlar,
Bugün dersimizde sizlere Firebase kütüphanesi kullanarak chat uygulamasının nasıl yapılacağını anlatacağım. Firebase ile ilgili realtime database kullanımını bu dersimizde ayrıntılı bir şekilde anlatmıştım. Şimdi Firebase Authentication ve Firebase Realtime Database özellikleri kullanılarak geliştirdiğimiz Firebase Chat Uygulaması dersimizi incelemeye başlayalım.

Öncelikle android uygulamamızda realtime database kullanacağımız için projemizi firebase sistemine dahil etmemiz gerekiyor. Android Studio da Tools->Firebase->Realtime Database dediğimizde bazı seçenekler karşımıza geliyor. Sırasıyla 1-Connect to Firebase 2-Add the Realtime Database to your app seçeneklerini tıklıyoruz ve firebase için gerekli kütüphaneler otomatik olarak uygulamamıza iniyor. Şimdi authentication işlemlerini sağlayabilmek için Firebase Authentication modulunu aktif hale getirmemiz gerekiyor realtime database de yer alan işlemlerin aynılarını uyguluyoruz ve projemizi bağlıyoruz. Android Studio da Tools->Firebase->Authentication seçeneklerinden ayarları tamamlıyoruz.

Authentication için ayrıntılı bir şekilde anlattığım bu dersimi inceleyebilirsiniz.

build.gradle

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.0"
    defaultConfig {
        applicationId "com.mobilhanem.firebasechatandroidapp"
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.google.firebase:firebase-database:10.0.1'
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.android.support:cardview-v7:25.3.1'
    compile 'com.android.support:design:25.3.1'
    testCompile 'junit:junit:4.12'
}
apply plugin: 'com.google.gms.google-services'

Daha sonra bu siteye girdiğimizde sisteme projemizin entegre olduğunu görüyoruz eğer daha önce firebase için başka projeler oluşturduysanız listeden chat uygulaması için oluşturduğunuz projeyi bulup açıyoruz.

( projemizin adını FirebaseChatAndroidApp koymuştum )

Daha sonra Firebase console dan Authentication kısmında yer alan SIGN-IN METHOD e tıklatarak orada bulunan seçeneklerden Email/Password Enabled hale getiriyoruz. Böylece kullanıcıların kimlik doğrulamasını; e-posta ve parola ile yapabilmelerini etkinleştirmiş oluyoruz.

Şimdi Android Firebase Chat Uygulaması içeriğinde kullanacağımız json formatını projemize dahil edelim. Chat uygulamamızda belirli konular var örneğin Yazılım, Genel, Futbol vb. bu konulara tıklayarak sohbet başlatabiliyoruz. json formatımız aşağıdaki gibidir.

{
  "ChatSubjects" : {
    "Futbol" : {
      "key" : "deneme",
      "mesaj" : {
        "-KoZBZxIlsB5apcJirgF" : {
          "gonderici" : "[email protected]",
          "mesajText" : "Galatasaray güzel transferler yaptı",
          "zaman" : "01:56:11"
        }
      }
    },
    "Genel" : {
      "key" : "deneme",
      "mesaj" : {
        "-KoZBP4mkU-S7C37brma" : {
          "gonderici" : "[email protected]",
          "mesajText" : "Yarın yine sınav var",
          "zaman" : "01:55:26"
        },
        "-KoZBTyS_PQGTbtyo48o" : {
          "gonderici" : "[email protected]",
          "mesajText" : "Havalar inanılmaz sıcak",
          "zaman" : "00:53:57"
        }
      }
    },
    "Yazılım" : {
      "key" : "deneme",
      "mesaj" : {
        "-KoZBUrVc24Lk_WnJiAf" : {
          "gonderici" : "[email protected]",
          "mesajText" : "Android Uygulama Geliştirme Dersleri gerçekten çok faydalı",
          "zaman" : "01:55:50"
        },
        "-KpCD1sU4neVyVUv4hs1" : {
          "gonderici" : "[email protected]",
          "mesajText" : "mobil uygulama geliştirmek istiyorum",
          "zaman" : "17/07/2017 12:05"
        },
        "-KpVo8YVuWbj5K03pBeR" : {
          "gonderici" : "[email protected]",
          "mesajText" : "JAVA mı öğrensem yoksa Swift mi?",
          "zaman" : "20/07/2017 12:24"
        }
      }
    }
  }
}

Firebase Database seçeneğini seçtikten sonra bu json formatını import etmemiz gerekiyor ; Import JSON dedikten sonra hazırladığımız json uzantılı dosyayı seçip sisteme yüklüyoruz.

JSON formatını yükledikten sonra aşağıdaki gibi bir çıktı elde etmiş olacaksınız. “ChatSubjects” referansı altında çeşitli konular var konularıda açarsak içlerinde chat mesajları var ( gonderici, zaman ve mesajText ) gibi parametre değerleri tutuyor) sizde JSON formatını dilediğiniz gibi oluşturabilirsiniz.

Şimdi gelelim kod tarafını oluşturmaya; uygulamamızda ilk çalışacak olan MainActivity sınıfımız aşağıdadır. Eğer giriş yapmış ve firebase sistemine authenticate olmuş bir kullanıcı var ise direk HomeActivity açtırıyoruz. Login butonuna bastığımızda ise signInWithEmailAndPassword methodu kullanıcıdan email adresi ile parola alıyor ve login isteğinde bulunuyor. Daha sonra addOnCompleteListener ile de işlemin başarılı olup olmadığını kontrol ediyoruz.

MainActivity.java

package com.mobilhanem.firebasechatandroidapp;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity {

    private EditText editTextUserName;
    private EditText editTextUserPassword;
    private Button buttonLogin;
    private TextView txtRegister;
    private FirebaseAuth mAuth;
    private FirebaseUser firebaseUser;
    private String userName;
    private String userPassword;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextUserName = (EditText)findViewById(R.id.editTextUserName);
        editTextUserPassword = (EditText)findViewById(R.id.editTextUserPassword);
        buttonLogin = (Button) findViewById(R.id.buttonLogin);
        txtRegister = (TextView) findViewById(R.id.txtRegister);

        mAuth = FirebaseAuth.getInstance();
        firebaseUser = mAuth.getCurrentUser(); // authenticate olan kullaniciyi aliyoruz eger var ise

        if(firebaseUser != null){

            Intent i = new Intent(MainActivity.this,HomeActivity.class);
            startActivity(i);
            finish();
        }

        buttonLogin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                userName = editTextUserName.getText().toString();
                userPassword = editTextUserPassword.getText().toString();
                if(userName.isEmpty() || userPassword.isEmpty()){

                    Toast.makeText(getApplicationContext(),"Lütfen gerekli alanları doldurunuz!",Toast.LENGTH_SHORT).show();

                }else{

                    login();
                }
            }
        });

        txtRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this,RegisterActivity.class);
                startActivity(intent);
            }
        });




    }

    private void login() {

        mAuth.signInWithEmailAndPassword(userName,userPassword).addOnCompleteListener(MainActivity.this,
                new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){

                            Intent i = new Intent(MainActivity.this,HomeActivity.class);
                            startActivity(i);
                            finish();

                        }
                        else{
                            // hata
                            Toast.makeText(getApplicationContext(),task.getException().getMessage(),Toast.LENGTH_SHORT).show();
                        }
                    }

                });
    }
}

Üye olabilmek için oluşturduğumuz Register sınıfımızda aşağıdadır. Kodları incelediğimizde; createUserWithEmailAndPassword methodu kullanıcı adını ( kullanıcı email adresi ) ile parolasını alıyor yine addOnCompleteListener ile de işlemin başarılı olup olmadığını kontrol ediyoruz eğer register işleminde sorun yok ise kullanıcıyı MainActivity sayfasına yönlendiriyoruz.

RegisterActivity.java

package com.mobilhanem.firebasechatandroidapp;

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;

public class RegisterActivity extends AppCompatActivity {

    private EditText registerUserName;
    private EditText registerPassword;
    private Button buttonRegister;
    private FirebaseAuth mAuth;
    private String userName;
    private String userPassword;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        registerUserName = (EditText)findViewById(R.id.registerUserName);
        registerPassword = (EditText)findViewById(R.id.registerPassword);
        buttonRegister = (Button) findViewById(R.id.buttonRegister);

        mAuth = FirebaseAuth.getInstance();

        // register buton tiklaninca
        buttonRegister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                userName = registerUserName.getText().toString();
                userPassword = registerPassword.getText().toString();
                if(userName.isEmpty() || userPassword.isEmpty()){

                    Toast.makeText(getApplicationContext(),"Lütfen gerekli alanları doldurunuz!",Toast.LENGTH_SHORT).show();

                }else{

                    register();
                }

            }
        });

    }

    private void register() {

        mAuth.createUserWithEmailAndPassword(userName,userPassword)
                .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(Task<AuthResult> task) {
                        if(task.isSuccessful()){
                            Intent i = new Intent(RegisterActivity.this,MainActivity.class);
                            startActivity(i);
                            finish();
                        }
                        else{
                            Toast.makeText(getApplicationContext(),task.getException().getMessage(),Toast.LENGTH_SHORT).show();
                        }

                    }


                });

    }
}

Login ve Register işlemlerine de incelediğimize göre şimdi HomeActivity sınıfımıza bakalım; yukarıda json yapısının oluştururken anlattığım gibi chat konularımızı Firebase Database den çekiyoruz ve ListView de gösteriyoruz. Bu konuları sohbet odaları olarak da düşünebiliriz.

HomeActivity.java

package com.mobilhanem.firebasechatandroidapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.util.ArrayList;

public class HomeActivity extends AppCompatActivity {

    private ListView listView;
    private FirebaseAuth fAuth;
    private ArrayList<String> subjectLists = new ArrayList<>();
    private FirebaseDatabase db;
    private DatabaseReference dbRef;
    private ArrayAdapter<String> adapter;

    @Override
    public void onBackPressed() {
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        fAuth = FirebaseAuth.getInstance();

        listView = (ListView)findViewById(R.id.listViewSubjects);

        db = FirebaseDatabase.getInstance();
        dbRef = db.getReference("ChatSubjects");

        adapter = new ArrayAdapter<String>(HomeActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1,subjectLists);
        listView.setAdapter(adapter);


        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                subjectLists.clear();
                for(DataSnapshot ds : dataSnapshot.getChildren()){
                    subjectLists.add(ds.getKey());
                    Log.d("LOGVALUE",ds.getKey());
                }
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                Toast.makeText(getApplicationContext(),""+databaseError.getMessage(),Toast.LENGTH_SHORT).show();
            }
        });


        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(HomeActivity.this, ChatActivity.class);
                intent.putExtra("subject",subjectLists.get(position));
                startActivity(intent);
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu,menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.exit)
        {
            fAuth.signOut();
            finish();
        }
        return super.onOptionsItemSelected(item);
    }
}

Mesaj yapısını tutabileceğimiz bir model oluşturuyoruz bu model de yukarıda anlatmış olduğum json yapısına göre tasarlanması gerekiyor.

Message.java

package com.mobilhanem.firebasechatandroidapp;

/**
 * Created by alper on 16/07/2017.
 */

public class Message {

    String mesajText;
    String gonderici;
    String zaman;

    public Message() {
    }

    public Message(String mesajText, String gonderici, String zaman) {
        this.mesajText = mesajText;
        this.gonderici = gonderici;
        this.zaman = zaman;
    }

    public String getMesajText() {
        return mesajText;
    }

    public void setMesajText(String mesajText) {
        this.mesajText = mesajText;
    }

    public String getGonderici() {
        return gonderici;
    }

    public void setGonderici(String gonderici) {
        this.gonderici = gonderici;
    }

    public String getZaman() {
        return zaman;
    }

    public void setZaman(String zaman) {
        this.zaman = zaman;
    }

}

Chat kısmında eğer gönderici ile sisteme authenticate olan kişi aynı ise atmış olduğu mesaj için ayrı bir layout oluşturuyoruz ve tam tersi durumda ise yine farklı bir layout tasarlıyoruz. Bu aşamada kaynak kodları indirip çalıştırmanız faydalı olacaktır.

Chat kısmında iki çeşit layout olacağını söylemiştim bunların kaynak kodları:

right_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    android:gravity="right"
    android:orientation="horizontal">

    <android.support.v7.widget.CardView
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_margin="10sp"
        app:cardBackgroundColor="#b2ff59"
        app:cardCornerRadius="20sp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:textColor="#eefffc"
                android:id="@+id/txtUserRight"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:text="TextView" />

            <TextView
                android:textColor="#eefffc"
                android:id="@+id/txtMessageRight"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:textSize="24sp" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="right"
                android:orientation="horizontal">

                <TextView
                    android:textColor="#eefffc"
                    android:id="@+id/txtTimeRight"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="TextView" />
            </LinearLayout>
        </LinearLayout>

    </android.support.v7.widget.CardView>
</LinearLayout>

left_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp"
    android:orientation="horizontal">

    <android.support.v7.widget.CardView
        android:layout_width="250dp"
        android:layout_height="wrap_content"
        android:layout_margin="10sp"
        app:cardBackgroundColor="#81d4fa"
        app:cardCornerRadius="20sp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:padding="10dp">

            <TextView
                android:id="@+id/txtUserLeft"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:text="TextView" />

            <TextView
                android:id="@+id/txtMessageLeft"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="TextView"
                android:textSize="24sp" />

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="right"
                android:orientation="horizontal">

                <TextView
                    android:id="@+id/txtTimeLeft"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="TextView" />
            </LinearLayout>
        </LinearLayout>

    </android.support.v7.widget.CardView>
</LinearLayout>

Şimdi gelelim chat kısmındaki ListView i dolduracağımız Adapter yapısını incelemeye; sistemdeki güncel kullanıcının e-posta adresi ile mesajlardaki e-posta aynı olduğunda right_item_layout u kullan, farklı olduğunda left_item_layout u kullan diyoruz.

CustomAdapter.java

package com.mobilhanem.firebasechatandroidapp;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import com.google.firebase.auth.FirebaseUser;

import java.util.ArrayList;

/**
 * Created by alper on 16/07/2017.
 */

public class CustomAdapter extends ArrayAdapter<Message> {

    private FirebaseUser firebaseUser;

    public CustomAdapter(Context context, ArrayList<Message> chatList,FirebaseUser firebaseUser) {
        super(context, 0, chatList);
        this.firebaseUser = firebaseUser;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        Message message = getItem(position);
        if (firebaseUser.getEmail().equalsIgnoreCase(message.getGonderici())){

            convertView = LayoutInflater.from(getContext()).inflate(R.layout.right_item_layout, parent, false);

            TextView txtUser = (TextView) convertView.findViewById(R.id.txtUserRight);
            TextView txtMessage = (TextView) convertView.findViewById(R.id.txtMessageRight);
            TextView txtTime = (TextView) convertView.findViewById(R.id.txtTimeRight);

            txtUser.setText(message.getGonderici());
            txtMessage.setText(message.getMesajText());
            txtTime.setText(message.getZaman());

        }else{

            convertView = LayoutInflater.from(getContext()).inflate(R.layout.left_item_layout, parent, false);

            TextView txtUser = (TextView) convertView.findViewById(R.id.txtUserLeft);
            TextView txtMessage = (TextView) convertView.findViewById(R.id.txtMessageLeft);
            TextView txtTime = (TextView) convertView.findViewById(R.id.txtTimeLeft);

            txtUser.setText(message.getGonderici());
            txtMessage.setText(message.getMesajText());
            txtTime.setText(message.getZaman());

        }

        return convertView;
    }
}

HomeActivity de ListView de yer alan konulara tıkladığımızda ChatActivity açıldığını göreceksiniz. Açılan bu sayfada neler yaptık şimdi onu inceleyelim; HomeActivity den gönderdiğimiz değeri aldık ve ilgili referans değerine ulaştık. Json yapısını incelediğimizde en üst kısıma “ChatSubjects” adını vermiştik önce ona ulaşıyoruz daha sonra içindeki konuya ( HomeActivity den gelen değer ) daha sonra da ilgili “mesaj” bloğuna erişiyoruz.

String subject = bundle.getString("subject");
DatabaseReference dbRef = db.getReference("ChatSubjects/"+subject+"/mesaj");

addValueEventListener methodu ile veritabanında değerlerde herhangi bir değişiklik oldu mu diye bakıyoruz eğer olduysa ListView yapımızı güncelliyoruz. ( yeni bir mesaj eklenebilir, mesajın içeriğinde değişiklik olabilir vb. )

Yeni bir mesaj girildiğinde ise Message model yapımızı oluşturuyoruz ( kullanıcıdan girdiği mesaj içeriğini, kullanıcının e-posta adresini ve mesajı girdiği andaki güncel zaman dilimini kullanıyoruz ) daha sonra da DatabaseReference objesini kullanarak oluşturduğumuz Message objesini veritabanına ekliyoruz.

Message message = new Message(inputChat.getText().toString(),fUser.getEmail(),dateTime);
dbRef.push().setValue(message);

ChatActivity.java

package com.mobilhanem.firebasechatandroidapp;

import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;

import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

public class ChatActivity extends AppCompatActivity {

    private FirebaseDatabase db;
    private DatabaseReference dbRef;
    private FirebaseUser fUser;
    private ArrayList<Message> chatLists = new ArrayList<>();
    private CustomAdapter customAdapter;
    private String subject;
    private ListView listView;
    private FloatingActionButton floatingActionButton;
    private EditText inputChat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);

        listView = (ListView)findViewById(R.id.chatListView);
        inputChat = (EditText)findViewById(R.id.inputChat);
        floatingActionButton = (FloatingActionButton)findViewById(R.id.fab);

        db = FirebaseDatabase.getInstance();
        fUser = FirebaseAuth.getInstance().getCurrentUser();


        customAdapter = new CustomAdapter(getApplicationContext(),chatLists,fUser);
        listView.setAdapter(customAdapter);

        Bundle bundle = getIntent().getExtras();
        if(bundle != null){
            subject = bundle.getString("subject");
            dbRef = db.getReference("ChatSubjects/"+subject+"/mesaj");
            setTitle(subject);
        }


        dbRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                chatLists.clear();
                for(DataSnapshot ds : dataSnapshot.getChildren()){
                    Message message = ds.getValue(Message.class);
                    chatLists.add(message);
                    //Log.d("VALUE",ds.getValue(Message.class).getMesajText());
                }
                customAdapter.notifyDataSetChanged();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(inputChat.getText().length()>=6){

                    long msTime = System.currentTimeMillis();
                    Date curDateTime = new Date(msTime);
                    SimpleDateFormat formatter = new SimpleDateFormat("dd'/'MM'/'y hh:mm");
                    String dateTime = formatter.format(curDateTime);
                    Message message = new Message(inputChat.getText().toString(),fUser.getEmail(),dateTime);
                    dbRef.push().setValue(message);
                    inputChat.setText("");

                }else{

                    Toast.makeText(getApplicationContext(),"Gönderilecek mesaj uzunluğu en az 6 karakter olmalıdır!",Toast.LENGTH_SHORT).show();
                }


            }
        });
    }
}

Evet arkadaşlar böylece Android Firebase Chat Uygulaması nı tamamlamış olduk kısaca yaptıklarımızı özetleyecek olursak Firebase Authentication ile kullanıcı kimlik doğrulama ( sisteme kayıt olma ve giriş yapma ) işlemlerini gerçekleştirdik kullanıcı giriş yaptıktan sonra karşısına JSON yapısına bağlı olarak çeşitli chat konuları geldi o chat konularına tıklayarak da sohbet odalarına giriş yapmış olduk. Firebase Realtime Dabase yapısını  kullanarak da mesajlaşma kısmını oluşturduk. Firebase de gerçekten bir çok özellik var sizlere tavsiyem Firebase yapısını daha çok kurcalayıp farklı bilgiler edinmek ayrıca bu dersimizdeki temel amaç diğer ders serilerimizde öğrenmiş olduğumuz bilgileri kullanarak chat uygulamasının yapım aşamalarını sizlere göstermekti umarım faydalı olmuştur.

not: ( Firebase Chat Uygulaması Google Play Services  yüklü olmayan bir Genymotion emülatörde  çalışmayacaktır !  Eğer Google Play Service yüklü değilse ya GenyMotion a eklenti olarak kuracaksınız yada Android Emulator veya gerçek cihazda deneyeceksiniz. ) 

Tüm Android Ders, Proje ve Kaynak Kodlar için tıklayınız.

Mobilhanem.com üzerinden anlattığımız mobil uygulama geliştirme derslerine devam edeceğiz. Bu dersimizde Firebase Chat Uygulaması konusunu anlatmaya çalıştık. Konu hakkında sorunuzu yorum alanından sorabilirsiniz. Konu dışı sorularınızı ve tüm yazılımsal sorularınızı sorucevap.mobilhanem.com sitemizden de sorabilirsiniz.

Bir dahaki dersimizde görüşmek dileğiyle..

21

Alper Beyler

Yüksek Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği
Lisans: Çankaya Üniversitesi / Bilgisayar Mühendisliği (4/3.30) (2010-2014)
Lisans : Viyana Teknik Üniversitesi / Bilgisayar Bilimleri (2013)

46 Yorum

  • Merhaba hocam, elinize sağlık güzel bir ders olmuş. Bu mesajlaşmayı 1’e 1, yani sadece 2 kullanıcı arasında nasıl gerçekleştirebiliriz?

  • merhaba uygulamayı yaptım login olurken ve giriş yaparken uygulama durduruldu hatası veriyor bir daha acılmıyor uygulamayı kaldırıp tekrar kuruyorum tekrar login olurken ay nı hatayı alıyorum

    • Merhaba, öncelikle dersteki kaynak kodu mu indirip çalıştırdığınızda bu hatayı alıyorsunuz ? uygulama durduruldu hatasını aldığınızda logcat çıktısında hatanın neden kaynaklandığını yazması gerekiyor onuda paylaşırsanız yardımcı olmaya çalışalım

  • Merhaba.
    Amatör bir programcı olarak Bulut Veritabanı sistemlerinin herangi bir işe yarayacağını düşünmüyorum. Örneğin ben firmamın veritabanı bilgilerini neden Bulut Veritabanında saklayayım. O zaman benim verilerimin gizliliği nerede kalır. Programcıları yenilik filan deyip böyle boş işlerle uğraştırıyorlar. Böyle bir veritabanı sistemi ancak sunucu sizin kendinize aitse kullanılabilir. Yoksa ABD nin bilmem neresindeki Bulut Veritabanında kimse veri falan saklamaz. Olsa olsa önemsiz bilgilerini resimdir, notlardır bunları saklar. Gereksizdir demiyorum ama çok iddialı olmak ve yazılımcıyı böyle boş şeylerle meşgul etmek gereksiz.

    • Merhaba, Firebase sistemini ne kadar incelediniz ? güvenlik açısından neler yaptığını nasıl bir çalışma mekanizması olduğunu biliyor musunuz ? Google gibi bir şirket bu sisteme onca destek verirken , Turkcell kendi gerçekleştirdiği eğitimlerinde olsun kendi projelerinde olsun Firebase sistemini kullanıyorken sizin kalkıp bol şeylerler uğraşmak demeniz ne kadar doğru bilemiyorum. Sektörde kaç yıldır yazılım dünyasının içerisinde biri olarak sizlere ; önyargılı yaklaşmanın doğru olmadığını belirtip, bu konuda daha çok araştırma yapmanızı öneririm.

    • yeniliklere kapalı bir yazılımcı olma adayı daha henüz olamamış muhtemelen de olamaz. Arkadaşın da dediği gibi cehalet kokan bir yorum olmuş tebrikler.

  • Merhaba,

    HomeActivity.java içerisinde editör R.menu.menu (2.sıradaki menu) ve R.id.exit (exit) tanımıyor. “cannot resolve symbol” ibaresi çıkıyor. Ne yapabilirim?

    @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menu,menu);
            return true;
        }
    
        @Override
        public boolean onOptionsItemSelected(MenuItem item) {
            if (item.getItemId() == R.id.exit)
            {
                fAuth.signOut();
                finish();
            }
            return super.onOptionsItemSelected(item);
        }
  • Merhabalar bu projedeki bir konuya tıkladığımızda bu konuyu 2 kişinin bire bir konuşma olayını nasıl yapabiliriz?

  • Eline Sağlık. Türkçe kaynağın neredeyse olmadığı bir zamanda bu şekilde projeyi paylaşmak gerçekten emek içeren ve güzel bir hareket. Başarılarının devamını dilerim

    • Merhaba, çok teşekkürler olumlu düşünceleriniz için biz de elimizden geldiğince bildiklerimizi aktarmaya çalışıyoruz.

      • Whatsapp tarzı bir uygulama örneğini, firebase veya benzeri bir api üzerinden anlatma şansın var mı, yabancı kaynaklarda bulmak mümkün lakin, türkçe bir kaynak olduğunda anlaşılması daha kolay olur diye düşünüyorum hocam. Saygılarımla

        • Merhaba, whatsapp tarzı uygulamalar biraz daha kapsamlı ve zaman alıcı konular fakat söylediğinizi dikkate alacağız zaman olursa en kısa zamanda anlatmaya çalışırız, iyi günler.

  • Saygı değer hocam her şeyi iyi hoş güzelce yaptım fakat takıldığım bi yer oldu yeni mesaj gelince en alt satırı göstermesi için ne yapmam gerek

  • one to one bir mesajlaşma yaptırmak istiyorum. Ancak diyelim ki zaman geçtikçe çok fazla kullanıcıya ulaşabilir uygulama. Bunun için firebase yine de uygun mudur hocam?

    • Bu arada burada FCM kullanılmamış.
      Normal bir veritabanı işlemi yapılmış.
      Mesajlaşma diyince aklıma FCM geldi. Bu yaklaşım doğru mu? ayrıca bir cihazdan başka bir cihaza direk mesaj yollamayı FCM desteklemiyormuş bunu öğrendiğim iyi oldu.
      ilgili link:

      https://stackoverflow.com/questions/37990140/how-to-send-one-to-one-message-using-firebase-messaging

      Bu arada ben aynı zamanda firebase databasemde facebook ile giriş yapan kullanıcıların verilerini saklıyorum. Mesajlaşma için 2. bir veritabanımı oluşturmam gerekiyor yoksa farklı bir json şablonu ekleyip bir tabloymuşcasına orayı mesajlaşma için kullanabiliyor muyum ???

        • Merhaba, yoğun olduğum için ilgilenemiyorum sorularla şimdi gördüm. kullanıcı verilerini nasıl saklıyorsun ? verileri çektiğinde kişileri ve mesajları ilişkilendirebilirsin. ben yukarıdaki örnekte bir konuya göre mesajlaşma işlemini gerçekleştirmiştim.

    • zaman geçtikçe veri sayısının çok artacağını düşünüyorsan ya firebase a para verip burdan devam edeceksin yada kendin server kısmını oluşturup firebase bağlı kalmadan ilerleyeceksin.

    • Merhaba, tam olarak sorunuz nedir nerede takıldınız ? buradan yardımcı olmaya çalışalım ne yazık ki dediğiniz şekilde yardımcı olamıyoruz.

  • Hocam kaynak kodu android studioda açtıyorum ChatActivity yi açtığımda bir anda birsürü şeyin altı kırmızı çiziliyor yanlış yazılmış gibi ama bu birtek bu projede olmuyor çoğunda böyle sanırım bu ide den kaynaklı eksik birşey mi yükledim acaba yardımcı olabilir misiniz

  • merhaba firebase te kullanıcı arkadaşinin ismine tıklayınca onun profil sayfasına gitmesini nasil şağlarım acaba?

  • Benim bu güvenlik olayında anlam veremediğim bir kaç olay var.

    Uygulamamda bir tabloya herhangi bir güvenlik koymaz isem uygulamam dışında bir kişi bağlantıyı bilirse veri tabanına istediği gibi yazabilirmi?

    yoksa sadece uygulama içinden istekler gönderilerek benim yazdığım fonksiyonlar ile mi çalışması sağlanır. sadece o aplikasyona özel bir bağlantımı oluyor?

    aplikasyon dışında linki bilen biri sisteme bağlanıp istediği değişikliği yapabilir mi

  • Hocam her şey sorunsuz çalışıyor fakat giriş yaptığımda HomeActivity’e futbol vs. gelmiyor boş geliyor, sizce sorun nerede?

  • Burada bile futbol muhabeti yapman çok sinir bozucu. Yazacak baska bir sey bulamadın da futbol muhabeti mi…

    • selamlar,futbol muhabbeti ile bu konumuzun nasıl bir bağlantısı var ? o kadar detaylı anlatımı ve kodları incelemeyip; futbol örneğine mi takıldınız gerçekten şaşırtıcı.

  • Hocam merhaba , bende bi mesajlaşma uygulaması yapmaya çalışıyorum mesaj geldiği zaman bildirim almak istiyorum whatsapdaki gibi nasıl yapabilirlm acaba yardımcı olurmusunuz ?

  • Anlattığınız şekilde java kodlarını oluşturdum,firebase bağlantısını yaptım ama
    package com.mobilhanem.firebasechatandroidapp;
    yerine kendi uygulamamın adını yazdım
    package com.example.baykuschat;
    şeklinde,her sayfada hata alıyorum.

    Java kodları içindede bazı kodlar kırmızı örn; bölümüleri.

    Ve anlatımızdaki 2 metodu nereye yazacağım anlamadım.

    1-
    String subject = bundle.getString(“subject”);
    DatabaseReference dbRef = db.getReference(“ChatSubjects/”+subject+”/mesaj”);

    2-

    Message message = new Message(inputChat.getText().toString(),fUser.getEmail(),dateTime);
    dbRef.push().setValue(message);

    Açıkçası sizin bu uygulamanızı deneyerek başlamak istedim daha yeniyim
    yardımcı olursanız çok sevinirim,teşekkürler.

  • Json kodlarını import ediyorum firebase data ya başlık ve kodlar görünüyor bloklar oluşmuyor at katmanı okumuyor. json formatında kodları dosyaya çıkarıp aktardım bağlantı server veriyor danied permission tost bildirimi geliyor. Odalar görünmüyor ne firabase de nede uygulamada sorun nerde acaba json kodlarinda eksik yok değil mi

    • merhaba, buradaki projeyi indirip direk çalıştırıp denediniz mi ? sıfırdan proje oluşturup denedinizde permission hatası alıyorsanız read write ayarlarını kontrol etmelisiniz dersin içinde bahsettiğim aşamaları adım adım yapmaya çalışın lütfen. sizin kendi hesabınızla authenticate olup bu işlemleri yapmanız gerekmektedir. bu örnek benim hesabımla yapıldığı için veriler ve içerikler benim hesabıma bağlı.

  • 2. Sorum ise e posta adresini aktiflastirdim kayıt işleminde e mail format bildirimi veriyor kayıt yapmıyor bende firebase üzerinden kendimi Manuel kullanıcı olarak ekledim giriş yapıyorum uygulama üzerinden kayıt yapmıyor.

  • Merhabalar. Öncelikle güzel bir çalışma bende bu kodlar üzerinden gerçek zamanlı kişiler arası sohbet uygulaması yaptım fakat en büyük eksiğim uygulama kapandığında gelen mesajları bildirim olarak alamıyorum. Bunu nasıl ayarlayabiliyoruz. Bunun yöntemi nedir acaba

  • Teşekkürler
    bu uygulamayı çalıştırdım peki yazdığım mesajı silme işlemi nasıla olabilir mesela yazdığım mesajı long press yapınca popup menü açılacak ve orada bir kaç aksiyonlar olacak sil düzenle gibi ben sil kısmını yapmak istiyorum ama CustomAdapter.java kısmına yazıyorum kodları bunu nasıl yapabilirim
    örnek:

    FirebaseDatabase.getInstance().getReference(“ChatSubjects/Genel/mesaj”).child(“burası veritabanı id”).removeValue();

    bu kodda child(“burası veritabanı id”) kısmı veritabanındaki rastgele oluşturulan kısımdaki id yi buraya yapıştırdım ve mesajı sildi ama sadece o id girildiği için onu sildi ben rastgele oluşan id leri nasıl silebilirim sadece benim attığım mesajlar silinmesini istiyorum

Haftalık Bülten

Mobilhanem'de yayınlanan dersleri haftalık mail almak ister misiniz?