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’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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”
}
}
}
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
{ “ChatSubjects” : { “Futbol” : { “key” : “deneme”, “mesaj” : { “-KoZBZxIlsB5apcJirgF” : { “mesajText” : “Galatasaray güzel transferler yaptı”, “zaman” : “01:56:11” } } }, “Genel” : { “key” : “deneme”, “mesaj” : { “-KoZBP4mkU-S7C37brma” : { “mesajText” : “Yarın yine sınav var”, “zaman” : “01:55:26” }, “-KoZBTyS_PQGTbtyo48o” : { “mesajText” : “Havalar inanılmaz sıcak”, “zaman” : “00:53:57” } } }, “Yazılım” : { “key” : “deneme”, “mesaj” : { “-KoZBUrVc24Lk_WnJiAf” : { “mesajText” : “Android Uygulama Geliştirme Dersleri gerçekten çok faydalı”, “zaman” : “01:55:50” }, “-KpCD1sU4neVyVUv4hs1” : { “mesajText” : “mobil uygulama geliştirmek istiyorum”, “zaman” : “17/07/2017 12:05” }, “-KpVo8YVuWbj5K03pBeR” : { “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
@Override
public void onComplete(@NonNull 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();
}
}
});
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
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 @Override public void onComplete(@NonNull 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
@Override
public void onComplete(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();
}
}
});
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
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 @Override public void onComplete(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
private FirebaseDatabase db;
private DatabaseReference dbRef;
private ArrayAdapter
@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
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);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
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 private FirebaseDatabase db; private DatabaseReference dbRef; private ArrayAdapter
@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 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;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
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
private FirebaseUser firebaseUser;
public CustomAdapter(Context context, ArrayList
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;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
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
private FirebaseUser firebaseUser;
public CustomAdapter(Context context, ArrayList 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”);
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);
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
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();
}
}
});
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
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 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..
18