Android Firebase ile Google Kullanıcı Girişi
Merhaba dostlar bugün sizlerle firebase yardımı ile google kullanıcı girişi nasıl oluşturulur onu konuşacağız. Öncelikle firebase, Google’ın sunduğu bir çok çeşit aracı bünyesinde bulunduran bir konsoldur.
Firebase ile iOS, Android ve Web uygulamalarınıza; authentication (Kimlik Giriş Kontrolü), uygulamanız için database/veritabanı, uygulamanız için hosting gibi hizmetleri kolay bir şekilde ekleyebiliyorsunuz.
Hemen konumuza geçelim; kullanıcılarınızın google hesabı ile uygulamanıza giriş yapabilmesi demek, sizin bir veritabanında kullanıcı verilerini tutmanıza gerek olmaması ve kullanıcıların da en baştan bilgilerini vererek kayıt olma zorluğuna girmemesi demektir. Bir çok yönden kolaylık sağladığı için çoğu uygulama bu şekilde çalışmakta artık.
Şimdi adım adım nasıl yapacağımızı anlatalım.
1. Firebase hesabı oluşturmak ve uygulamanızı firebase’e eklemek:
İlk yapmamız gereken bir firebase hesabı oluşturmaktır, şu linke tıklayarak firebase konsoluna hesabınız ile giriş yapabilirsiniz. Sonrasında Add Project diyerek yeni bir proje oluşturalım ve açılan ekranda proje adı ve ülke seçimi yapalım.
Projemizi oluşturduktan sonra artık uygulamamızı ekleme ekranına geliyoruz hangi platformda geliştiriyorsak onu seçerek devam ediyoruz ki biz Android için konuştuğumuz için “Add Firebase to your Android app” seçimini yapıyoruz.
Karşımıza bu şekilde bir ekran gelmiş olması gerekiyor, uygulamanızın package adını ve diğer istenilenleri uyguladıktan sonra uygulamanızı projenizde görüyor olmanız gerekiyor dostlar.
2. Firebase projenize Authentication eklemek:
Firebase projenizin olduğu ekranın solunda DEVELOP sekmesinin altında Authentication seçeneğine tıklayalım açılan ekranda SIGN-IN METHOD adlı sekmeye gelelim, gördüğünüz gibi kullanıcı girişi için yapabileceğimiz bir çok seçenek sunuyor bize firebase.
Biz google ile giriş yapmak istediğimiz için Google‘ı seçiyoruz, Enable ediyoruz ve save diyerek kaydediyoruz.
Artık Android Studio’da uygulamamız içinde yapacağımız değişikliklere geçebiliriz.
3. Uygulamıza interneti kullanabilme iznini eklemek:
AndroidManifest.xml dosyasının içinde aplication taglarının üstüne yeni bir permission ekleyelim:
1 | <uses-permission android:name="android.permission.INTERNET" /> |
4. build.gradle dosyalarındaki değişiklikler:
4.1 – build.gradle(Project:) dosyamızda dependencies içine google-services’ı ekleyelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | buildscript { repositories { ... } dependencies { ... classpath 'com.google.gms:google-services:3.1.0' ... // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } |
4.2 – build.gradle(Module: app) dosyamızın dependencies’lerinin içine ihtiyacımız olan kütüphaneleri ekleyelim:
1 2 3 4 5 6 7 | dependencies { ... compile 'com.google.firebase:firebase-core:9.8.0' compile 'com.google.firebase:firebase-auth:9.8.0' compile 'com.google.android.gms:play-services-auth:9.8.0' ... } |
4.3 – build.gradle(Module: app) içinde yapacağımız son değişiklik ise google servisleri plug-ini eklemek olacak. dependencies taglarından sonra eklemenizde fayda olacaktır. Başa eklendiğinde hata çıkabilir.
1 2 3 4 5 6 7 8 9 | dependencies { ... compile 'com.google.firebase:firebase-core:9.8.0' compile 'com.google.firebase:firebase-auth:9.8.0' compile 'com.google.android.gms:play-services-auth:9.8.0' ... } apply plugin: 'com.google.gms.google-services' |
5. Uygulamamıza giriş ekranı eklemek:
Şimdi yeni bir blank activity oluşturalım ve adını SignInActivity koyalım dostlar. Java ve Xml dosyalarımızın oluşturulması bittikten sonra activity_sign_in.xml dosyamızı açalım ve içine aşağıdaki kodları kopyalayalım:
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 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" android:paddingBottom="10dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="100dp" tools:context="com.SignInActivity"> <TextView android:id="@+id/name_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="30dp" android:text="" /> <TextView android:id="@+id/email_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="50dp" android:layout_marginTop="50dp" android:text="" /> <com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="40dp" /> <Button android:id="@+id/sign_out_button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Çıkış Yap" android:visibility="gone" /> </LinearLayout> |
İki view ve iki button’lı basit bir sayfa oluşturduk. Amacımız Sign-in tuşuna basıldığında giriş yapmak ve sayfadaki sign butonunu gizleyerek çıkış yap butonunu aktif etmek. Hemen yapalım.
SignInActivity.java dosyamızı açalım ve içini aşağıdaki kodlarla dolduralım:
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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 | package com.blabla //kendi package adınızla değiştirmeyi unutmayın import android.content.Intent; import android.support.annotation.NonNull; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.auth.api.Auth; import com.google.android.gms.auth.api.signin.GoogleSignInAccount; import com.google.android.gms.auth.api.signin.GoogleSignInOptions; import com.google.android.gms.auth.api.signin.GoogleSignInResult; import com.google.android.gms.common.ConnectionResult; import com.google.android.gms.common.api.GoogleApiClient; import com.google.android.gms.common.api.ResultCallback; import com.google.android.gms.common.api.Status; import com.google.android.gms.tasks.OnCompleteListener; import com.google.android.gms.tasks.Task; import com.google.firebase.auth.AuthCredential; import com.google.firebase.auth.AuthResult; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; import com.google.firebase.auth.GoogleAuthProvider; public class SignInActivity extends AppCompatActivity { private static final String TAG = "SignInActivity"; private static final int RC_SIGN_IN = 0 ; private FirebaseAuth mAuth; private FirebaseAuth.AuthStateListener mAuthListener; private com.google.android.gms.common.SignInButton signInButton; private GoogleApiClient mGoogleApiClient; private Button signOutButton; private TextView nameTextView; private TextView emailTextView; public FirebaseUser user; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); signInButton = findViewById(R.id.sign_in_button); signOutButton = findViewById(R.id.sign_out_button); nameTextView = findViewById(R.id.name_text_view); emailTextView = findViewById(R.id.email_text_view); GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken(getString(R.string.default_web_client_id)) .requestEmail() .build(); mGoogleApiClient = new GoogleApiClient.Builder(this) .enableAutoManage(this , new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { } } /* Bağlantı fail olup olmadığını dinliyoruz */) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); mAuth = FirebaseAuth.getInstance(); mAuthListener = new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { user = firebaseAuth.getCurrentUser(); signInButton.setVisibility(View.GONE); signOutButton.setVisibility(View.VISIBLE); if (user != null) { // kullanıcı giriş yaptı Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); if(user.getDisplayName() != null) nameTextView.setText("HI " + user.getDisplayName().toString()); emailTextView.setText(user.getEmail().toString()); } else { // kullanıcı çıkış yaptı Log.d(TAG, "onAuthStateChanged:signed_out"); } // ... } }; signInButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { signIn(); } }); signOutButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { FirebaseAuth.getInstance().signOut(); Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback( new ResultCallback() { @Override public void onResult(Status status) { signInButton.setVisibility(View.VISIBLE); signOutButton.setVisibility(View.GONE); emailTextView.setText(" ".toString()); nameTextView.setText(" ".toString()); } }); } // .. }); } private void signIn() { Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { //Google girişi başarılı oldu, Firebase ile haberleşiyoruz GoogleSignInAccount account = result.getSignInAccount(); firebaseAuthWithGoogle(account); } else { // Google girişi fail oldu // ... } } } @Override public void onStart() { super.onStart(); mAuth.addAuthStateListener(mAuthListener); } @Override public void onStop() { super.onStop(); if (mAuthListener != null) { mAuth.removeAuthStateListener(mAuthListener); } } private void firebaseAuthWithGoogle(GoogleSignInAccount acct) { Log.d(TAG, "firebaseAuthWithGoogle:" + acct.getId()); AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null); mAuth.signInWithCredential(credential) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task task) { Log.d(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); // giriş başarısız olduğunda toast mesajı gösterme if (!task.isSuccessful()) { Log.w(TAG, "signInWithCredential", task.getException()); Toast.makeText(SignInActivity.this, "Authentication failed.", Toast.LENGTH_SHORT).show(); } } }); } } |
Evet dostlar eğer tüm adımları doğru şekilde implement ettiyseniz sonucu görmüş olmanız gerekmekte, eğer bir aksilikle karşılaşırsanız aşağıya yazarak sorabilirsiniz. Kendinize iyi bakın.
elinize sağlık. Çok işime yaradı
Rica ederim, iyi çalışmalar.
Merhaba.
Android uygulamama admob banner eklemek istiyorum ama bir türlü yapamadım. Aşağıda ki linkte kodlar mevcut. Yardım edebilir misiniz?
https://stackoverflow.com/questions/50243486/webview-admob-banner
Merhaba Mehmet,
https://ahmetkilinc.net/android-uygulamasina-google-reklamlari-eklemek
sayfasına bakarsan detaylı bir anlatımı bulabilirsin, yinede sorun yaşarsan lütfen tekrar irtibata geç benimle.
Merhaba benim sorum
Firebase ile aynı kullanıcının eşzamanlı girişleri nasıl önlenir?
bunun hakkında bana yardımcı olabilir misiniz ?
Örneğin kullanıcı google hesabı ile giriş yaptı fakat başka cihazda aynı google hesabı ile giriş yapamasın istiyorum.
Bu sorunun cevabını ben de bekliyorum..
merhaba hocam benim arkadaşlık uygulamasında normalde zaten herşey tamam ama ben nasıl google ile girişi ekleyeceğimi bilmiyorum anlatımınız biraz kafamı karıştırdı. yazdığım mailden bana destek olabilirmisiniz acaba 🙂
merhabalar, mail inizi göremedim maalesef tekrar kontrol ettim ama gelmemiş sizden bir mail. tekrar atabilirseniz elimden geleni yapmaya çalışırım.
Hocam her şey çok açık ve net ellerinize ve emeklerinize sağlık.. Benim bir sorum olacak..: Kullanıcı ilk kayıt olurken girdiği e-mail adresinin FireBase Veritabanında olup olmadığını yani aynı e-amil adresi ile kayıt olup olmadığını kontrol etmek istiyorum.. Biz bunu Android Studio tarafında kendimiz kodla mı kontrol ediyoruz yoksa FireBase buna önlem almış durumda mı ? Yani aynı e-mail adresi ile kayıt olunurken FireBase uyarı veriyor mu?
Şimdiden teşekkürler..
Ben uygulamamı yaptım, google ve facebook kullanıcı girişi koydum. uygulama emulatörde çok güzel çalışıyor ancak imzalamada release build yapınca paketi imzaladıktan sonraki apkda hiç bir giriş çalışmıyor.