Yazılımcılar, mobil uygulama içinde kullanıcının sosyal medya ve mail hesaplarına (Facebook, Gmail vb.) bağlantı kurmalarını sağlayarak kullanıcıya kolaylıklar sağlamaktadır.
Bu makalede, Kotlin dili ile Android uygulamasında kullanıcının Google hesabına giriş ve profil bilgilerini gösterme işlemlerinin nasıl yapılacağını anlatacağım.
Dilerseniz Kotlin ile Android’de Facebook Login adlı makalemi okuyarak Kotlin dili ile Android uygulamasında kullanıcının Facebook hesabına giriş ve profil bilgilerini gösterme işlemlerinin nasıl yapılacağını öğrenebilirsiniz.
Şimdi örneğimizin çıktısına bakalım.
Bu örneği oluşturabilmek için sırasıyla adımlarımızı anlatmaya başlayalım.
1- Google Projesi Oluşturma
https://console.developers.google.com/ sayfasını açıp Google hesabınıza giriş yaptıktan sonra aşağıda belirttiğim yerden New Project alanını seçmelisiniz.
Açılan ekranda proje ismini yazıp Create butonuna tıklayınız. Projeniz oluştuktan sonra sol menüde APIs & Services alanını seçiniz. APIs & Services sayfasının sol menüsünde OAuth consent screen sayfasını açtıktan sonra External seçip Create tıklayınız.(Şekil-1)
Şekil-1
Bu sayfadan sonra Şekil-2 resmindeki sayfa açılacaktır. Şekil-2 resminde belirttiğim alanları doldurup Save butonuna basınız.
Şekil-2
Açılan ekranda Scope tabındaki alanları doldurmanız gerekmemektedir. Cancel butonuna basmanız yeterlidir. Projemizde kullanacağımız Client Id’yi elde etmek için SHA-1 değerini oluşturmamız gerekir.
SHA-1 signing-certificate fingerprint oluşturma
SHA-1 oluşturmak için birden fazla yöntem bulunmaktadır. Ben size en kolay yöntemi göstereceğim. Android Studio’nın en sağ üst köşesinde Şekil-3’de belirttiğim Gradle alanını tıklayınız.
Şekil-3
Gradle bölümünde Proje ismi > app > Tasks > android yolunu takip ettiğinizde signingReport alanını görecekseniz. Bu alana tıkladığınızda aşağıdaki resimdeki bölüm açılacak ve içinde SHA-1 değerinizi göreceksiniz.
Bu SHA-1 değerini kopyalayıp, bir doküman dosyasına kayıt edin. SHA-1’i bir sonraki adımlarda kullanacağız.
Client Id’yi Oluşturma
APIs & Services menüsündeki Credentials sayfasını açalım. Bu sayfada Create credentials alanına tıkladıktan sonra OAuth client ID ‘yi seçelim.
Önemli uyarı: Projenizde error code 10 hatasıyla karşılaşmamak için Client ID’yi oluştururken ilk önce Application type alanı Android, sonrasında ikinci Client ID’nin Application type Web Application seçerek oluşturmalısınız.
Çözümün detaylı anlatımı : Create OAuth client ID sayfasında Application type
ilk önce Android seçin. Sonrasında elinizdeki SHA-1 değerini ve projenizin paket ismini belirttiğim alanlara ekleyiniz ve Create butonun tıklayın.Sonrasında tekrar Create OAuth client ID sayfasını açıp, Application type
Web Application seçerek oluşturmalısınız ve projenizde tipi Web application olan Client Id‘yi kullanacağız.Credentials sayfasında listelenen Client Id’lerden tipi Web Application olanı aşağıdaki resimde belirttiğim ikona tıklayarak kopyalayanız.
Kopyaladığımız Client Id bir dokümana kayıt edin. Artık Android projemizi oluşturmaya hazırız…:)
4-Android Projede Bazı Ayarlar
İlk önce AndroidManifest.xml dosyanıza aşağıdaki kodu ekleyerek internet izni vermelisiniz.
1 |
<uses-permission android:name=”android.permission.INTERNET” /> |
Projemin app dizinin altındaki build.gradle dosyasını açıyoruz. Dependencies kod bloklarının arasına aşağıdaki kodları yerleştirerek play-services-auth ve Picasso kütüphanelerini yüklüyoruz.
1 2 |
implementation 'com.google.android.gms:play-services-auth:19.0.0' implementation 'com.squareup.picasso:picasso:2.71828' |
5- Google Login Button Oluşturma
Ben Google’un hazır butonuna kullanmayı tercih etmedim. Bunun sebebi tasarımcınızın farklı buton tasarımlarını kullanması durumunda, tasarımı kolaylıkla arayüze aktarmayı göstermektir. MainActivity sınıfında ilişkilendireceğimiz arayüz kodları:
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 |
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#A1D6FF"> <Button android:id="@+id/google_login_btn" android:layout_width="wrap_content" android:layout_height="65dp" android:drawableLeft="@drawable/google_icon" android:drawablePadding="15dp" android:text="Sign in with Google" android:textAllCaps="false" android:textColor="@color/black" android:textSize="18sp" android:textStyle="bold" app:backgroundTint="#FFFFFF" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout> |
6- Google Login Kontrolü ve Verileri Alma
İlk öncelikle Kotlin’de arayüz elementlerinin id bilgilerini kullanarak, elemente kolayca erişmek için id ‘kotlin-android-extensions’ kodunu projemin app dizinin altındaki build.gradle dosyasının plugins alanının içine eklemeliyiz. Bu durumu projede uyguladım.
MainActivity, Gmail hesabına giriş yapıp yapamadığının kontrolünü yaptıktan sonra kullanıcının bazı verilerine ulaşabilmemize sağlayan sınıfdır. Aldığımız bilgileri tasarımda göstermek için DetailsActivity sınıfına aktardım. Daha detaylı açıklama yorum(comment) tag larında bulunmaktadır.
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 |
import android.content.Intent import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.google.android.gms.auth.api.signin.* import com.google.android.gms.common.api.ApiException import com.google.android.gms.tasks.Task import kotlinx.android.synthetic.main.main.* class MainActivity : AppCompatActivity() { lateinit var mGoogleSignInClient: GoogleSignInClient private val RC_SIGN_IN = 9001 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) //Telefonda kullanılan gmail hesabına bağlantı sağlanması //requestIdToken'da olusturduğumuz Client Id'yı ekledim val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("768803640646-v0ghe2nbko7h7eg3t22d81v2aqgohgdt.apps.googleusercontent.com") .requestEmail() .build() mGoogleSignInClient = GoogleSignIn.getClient(this, gso) //Buttona tıklama eventinde hazırlananan signIn metodunu çağırdık google_login_btn.setOnClickListener { signIn() } } private fun signIn() { val signInIntent = mGoogleSignInClient.signInIntent startActivityForResult( signInIntent, RC_SIGN_IN ) } //Başarılı kimlik doğrulamasından sonra mail hesap bilgilerini alma override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) //Kimlik doğrulama kontrolü if (requestCode == RC_SIGN_IN) { val task = GoogleSignIn.getSignedInAccountFromIntent(data) getSignInResult(task) } } //Google kullanıcısının bilgilerini getiren metod private fun getSignInResult(completedTask: Task<GoogleSignInAccount>) { try { val account = completedTask.getResult( ApiException::class.java ) //Kullanıcının Adı,Soyadı,Email ve Profil resmini çektik val googleFirstName = account?.givenName ?: "" val googleLastName = account?.familyName ?: "" val googleEmail = account?.email ?: "" val googleProfilePicURL = account?.photoUrl.toString() //Kullanıcı bilgilerini DetailsActivity sınıfına aktarıyoruz val myIntent = Intent(this, DetailsActivity::class.java) myIntent.putExtra("google_first_name", googleFirstName) myIntent.putExtra("google_last_name", googleLastName) myIntent.putExtra("google_email", googleEmail) myIntent.putExtra("google_profile_pic_url", googleProfilePicURL) this.startActivity(myIntent) } catch (e: ApiException) { Log.e("failed code=", e.statusCode.toString() ) } } //Kullanıcının signOut(çıkış) yapmasını sağlayan metod private fun signOut() { mGoogleSignInClient.signOut() .addOnCompleteListener(this) { //Arayüzde signOut olduğunda bir uyarı gösterebilirsiniz... } } } |
7- Google Kullanıcı Bilgilerini Tasarımda Gösterme
Örnek deki detay sayfasının tasarımını yapabilmek için github linkinde bulunan proje içindeki activity_details xml dosyasını kullanabilirsiniz. DetailsActivity sınıfında da activity_details xml’ini kullandık. DetailsActivity sınıfında ise kullanıcı bilgilerini MainActivity sınıfından alıp, arayüz tasarımına aktardık. Profil resmini de Picasso kütüphanesini kullanarak arayüz de gösterilmesini sağladım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import com.squareup.picasso.Picasso import kotlinx.android.synthetic.main.activity_details.* class DetailsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_details) //Google kullanıcı bilgilerini MainActivity'den aldım. val googleFirstName = intent.getStringExtra("google_first_name") val googleLastName = intent.getStringExtra("google_last_name") val googleEmail = intent.getStringExtra("google_email") val googleProfilePicURL = intent.getStringExtra("google_profile_pic_url") //Kullanıcın profil fotoğrafını alıp, Picasso sınıfı ile arayüzde gösterdim Picasso.get().load(googleProfilePicURL) .resize(500, 500).into(profil_pic); //Bilgileri arayüze aktardım google_name_textview.text = googleFirstName +" "+ googleLastName google_email_textview.text = googleEmail } } |
Projenin tüm dosya ve kodlarına github linkinden ulaşabilirsiniz.