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.

ahmet

Ahmet Kılınç - Software Developer

Bunlar da hoşunuza gidebilir...

5 Cevaplar

  1. fatihan dedi ki:

    elinize sağlık. Çok işime yaradı

  2. ahmet dedi ki:

    Rica ederim, iyi çalışmalar.

  3. mehmet dedi ki:

    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

  4. Onur dedi ki:

    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.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.