<p>This post is about how to authenticate users via Google Sign-in using the Google sign-in API, how to extract basic profile details like displayName, email, etc., and add signOut functionality in Android with the help of a simple demo app.</p> 
 
 
 
<div class="wp-block-buttons is-content-justification-center is-layout-flex wp-block-buttons-is-layout-flex"> 
<div class="wp-block-button"><a class="wp-block-button__link has-white-color has-text-color has-background" style="background-color: #060255;" href="https://github.com/arunk7839/GoogleLoginExp"><strong>DOWNLOAD CODE</strong></a></div> 
</div> 
 
 
 
<h4> </h4> 
<p><amp-youtube layout="responsive" width="1200" height="675" data-videoid="7Zs4nawVIA4" title="Implementing Google Sign-In in Android App"><a placeholder href="https://youtu.be/7Zs4nawVIA4"><img src="https://i.ytimg.com/vi/7Zs4nawVIA4/hqdefault.jpg" layout="fill" object-fit="cover" alt="Implementing Google Sign-In in Android App"></a></amp-youtube></p> 
<h4><strong><span style="color: #000080;">Configuring a Google API Console project</span></strong></h4> 
<p>Firstly, we must configure the google API console account before configuring a Google API Console project.</p> 
<ul> 
<li> 
<p>To configure a Google API Console project, u<span style="font-size: 16px;">se this </span><span style="color: #0000ff;"><strong><a style="color: #0000ff;" href="https://developers.google.com/identity/sign-in/android/start-integrating#configure_a_project">link</a></strong></span><span style="font-size: 16px;"> and click on</span><strong style="font-size: 16px;"><span style="color: #0000ff;"> &#8220;Configure a project&#8221;.</span></strong><span style="font-size: 16px;"> Enter the project name, select <strong><span style="color: #008000;">Android</span></strong>, enter the package name and SHA-1 certificate.</span></p> 
</li> 
<li>To generate the SHA1 follow the below steps:<br />1. Click <span style="color: #008000;"><strong>Gradle</strong></span> in right side panel then navigate: <strong><span style="color: #0000ff;">app >; Tasks >; android </span></strong><br />2. Double Click on <strong><span style="color: #0000ff;">signingReport</span></strong> (You will get SHA1 and MD5 in Run Bar (Sometimes it will be in Gradle Console)).</li> 
</ul> 
<h4><strong><span style="color: #000080;">Creating new project</span></strong></h4> 
<p>1 . Create a new project by going to <span style="color: #008000;"><strong>File ⇒ New Android Project</strong>,</span> select <span style="color: #008000;"><strong>Empty</strong></span> Activity, provide app <span style="color: #008000;"><strong>name</strong></span>, select language to <span style="color: #008000;"><strong>kotlin</strong></span> and then finally click on <span style="color: #0000ff;"><strong>finish</strong></span>.</p> 
<p>2 . In your project’s top-level build.gradle file, ensure that Google&#8217;s Maven repository is included:</p> 
<p><strong><span style="color: #0000ff;">build.gradle</span></strong></p> 
<pre>buildscript {<br /> repositories {<br /><span style="color: #008000;"><strong> google()</strong></span><br /> }<br />}</pre> 
<p>3 . Open app-level build.gradle file and add the below library under dependencies section:</p> 
<p><strong><span style="color: #0000ff;">build.gradle</span></strong></p> 
<pre>dependencies {<br /> implementation 'com.google.android.gms:play-services-auth:20.0.1'<br />}</pre> 
<p>4 . Open <span style="color: #008000;"><strong>AndroidManifest.xml</strong></span> file and add the Internet permission above <;application>;.</p> 
<p><span style="color: #0000ff;"><strong>AndroidManifest.xml</strong></span></p> 
<pre><;uses-permission android:name="android.permission.INTERNET" />;</pre> 
<h4><span style="color: #000080;"><strong>The Layout File</strong></span></h4> 
<p>5 . Add the <strong><span style="color: #008000;">TextView</span></strong> and Google <strong><span style="color: #008000;">SignInButton</span></strong> in <span style="color: #000080;"><strong>activity_main.xml</strong></span> file.</p> 
<p><strong><span style="color: #0000ff;">activity_main.xml</span></strong></p> 
<pre><;?xml version="1.0" encoding="utf-8"?>;<br /><;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> xmlns:app="http://schemas.android.com/apk/res-auto"<br /> xmlns:tools="http://schemas.android.com/tools"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"<br /> tools:context=".MainActivity">;<br /><br /> <;TextView<br /> android:id="@+id/textView"<br /> android:layout_width="match_parent"<br /> android:layout_height="wrap_content"<br /> android:layout_marginTop="30dp"<br /> android:gravity="center"<br /> android:text="LOGIN"<br /> android:textColor="@color/purple_500"<br /> android:textSize="40sp"<br /> android:textStyle="bold"<br /> app:layout_constraintEnd_toEndOf="parent"<br /> app:layout_constraintHorizontal_bias="0.5"<br /> app:layout_constraintStart_toStartOf="parent"<br /> app:layout_constraintTop_toTopOf="parent" />;<br /><br /> <;com.google.android.gms.common.SignInButton<br /> android:id="@+id/sign_in_button"<br /> android:layout_width="match_parent"<br /> android:layout_height="wrap_content"<br /> android:layout_marginLeft="12dp"<br /> android:layout_marginRight="12dp"<br /> android:layout_marginBottom="30dp"<br /> app:layout_constraintBottom_toBottomOf="parent"<br /> app:layout_constraintEnd_toEndOf="parent"<br /> app:layout_constraintHorizontal_bias="0.5"<br /> app:layout_constraintStart_toStartOf="parent" />;<br /><br /><;/androidx.constraintlayout.widget.ConstraintLayout>;</pre> 
<p>6 . The <strong><span style="color: #008000;">activity_second.xml</span></strong> file defines the UI of the next activity(<span style="color: #008000;"><strong>SecondActivity) </strong><span style="color: #000000;">that</span></span> opens after the user sign in. It consists of a <strong><span style="color: #008000;">SignOut</span></strong> button two <span style="color: #008000;"><strong>Textviews</strong></span> (to display user name and email).</p> 
<p><strong><span style="color: #0000ff;">activity_second.xml</span></strong></p> 
<pre><;?xml version="1.0" encoding="utf-8"?>;<br /><;androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"<br /> xmlns:app="http://schemas.android.com/apk/res-auto"<br /> xmlns:tools="http://schemas.android.com/tools"<br /> android:layout_width="match_parent"<br /> android:layout_height="match_parent"<br /> tools:context=".SecondActivity">;<br /><br /> <;TextView<br /> android:id="@+id/pName"<br /> android:layout_width="match_parent"<br /> android:layout_height="wrap_content"<br /> android:gravity="center"<br /> android:textColor="@color/purple_500"<br /> android:textSize="21sp"<br /> app:layout_constraintBottom_toBottomOf="parent"<br /> app:layout_constraintEnd_toEndOf="parent"<br /> app:layout_constraintHorizontal_bias="0.5"<br /> app:layout_constraintStart_toStartOf="parent"<br /> app:layout_constraintTop_toTopOf="parent" />;<br /><br /> <;TextView<br /> android:id="@+id/pEmail"<br /> android:layout_width="match_parent"<br /> android:layout_height="wrap_content"<br /> android:layout_marginTop="25dp"<br /> android:gravity="center"<br /> android:textColor="@color/purple_500"<br /> android:textSize="21sp"<br /> app:layout_constraintEnd_toEndOf="@+id/pName"<br /> app:layout_constraintStart_toStartOf="@+id/pName"<br /> app:layout_constraintTop_toBottomOf="@+id/pName" />;<br /><br /> <;Button<br /> android:id="@+id/btnSignOut"<br /> android:layout_width="wrap_content"<br /> android:layout_height="wrap_content"<br /> android:layout_marginTop="30dp"<br /> android:padding="10dp"<br /> android:text="Sign Out"<br /> android:textAllCaps="false"<br /> android:textSize="20sp"<br /> app:layout_constraintEnd_toEndOf="@+id/pEmail"<br /> app:layout_constraintStart_toStartOf="@+id/pEmail"<br /> app:layout_constraintTop_toBottomOf="@+id/pEmail" />;<br /><br /><;/androidx.constraintlayout.widget.ConstraintLayout>;</pre> 
<p>7 . Create a new kotlin object <strong><span style="color: #008000;">Utility</span></strong> and add the below code:</p>
<!-- WP QUADS Content Ad Plugin v. 2.0.98.1 -->
<div class="quads-location quads-ad2" id="quads-ad2" style="float:none;margin:0px;">

</div>
 
<p><strong><span style="color: #0000ff;">Utility.kt</span></strong></p> 
<pre>object Utility {<br /><br /> <span style="color: #008000;"><strong> // Check for existing Google Sign In account, if the user is already signed in</strong></span><br /><span style="color: #008000;"><strong> // the GoogleSignInAccount will be non-null.</strong></span><br /> fun isUserSignedIn(context: Context): Boolean {<br /><br /> val account = GoogleSignIn.getLastSignedInAccount(context)<br /> return account != null<br /> }<br /><br /> fun getGoogleSigninClient(activity: Activity): GoogleSignInClient {<br /><br /> <span style="color: #008000;"><strong>// Configure sign-in to request the user's ID, email address, and basic</strong></span><br /><span style="color: #008000;"><strong> // profile. ID and basic profile are included in DEFAULT_SIGN_IN.</strong></span><br /> val gso = GoogleSignInOptions<br /> .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)<br /> .requestEmail()<br /> .requestProfile()<br /> .build()<br /><br /><span style="color: #008000;"><strong> // Build a GoogleSignInClient with the options specified by gso.</strong></span><br /> return GoogleSignIn.getClient(activity, gso)<br /> }<br />}</pre> 
<p>8 . Open MainActivity.kt file and add the below code:</p> 
<p><strong><span style="color: #0000ff;">MainActivity.kt</span></strong></p> 
<pre>class MainActivity : AppCompatActivity() {<br /><br /> private lateinit var activityMainBinding: ActivityMainBinding<br /><br /> lateinit var mGoogleSignInClient: GoogleSignInClient<br /><br /> lateinit var startActivityForResult: ActivityResultLauncher<;Intent>;<br /><br /> override fun onCreate(savedInstanceState: Bundle?) {<br /> super.onCreate(savedInstanceState)<br /> activityMainBinding = ActivityMainBinding.inflate(layoutInflater)<br /> setContentView(activityMainBinding.root)<br /><br /> mGoogleSignInClient = getGoogleSigninClient(this@MainActivity)<br /><br /> activityMainBinding.signInButton.setSize(SignInButton.SIZE_WIDE)<br /><br /> activityMainBinding.signInButton.setOnClickListener {<br /> GoogleSignIn()<br /> }<br /><br /> startActivityForResult =<br /> registerForActivityResult(ActivityResultContracts.StartActivityForResult(),<br /> ActivityResultCallback<;ActivityResult>;()<br /> {<br /> if (it.resultCode == Activity.RESULT_OK) {<br /> handleSignData(it.data)<br /> }<br /> })<br /> }<br /> <br /> private fun GoogleSignIn() {<br /><br /> if (!isUserSignedIn(this)) {<br /><br /> <span style="color: #008000;"><strong> //creating a sign-in intent with the getSignInIntent method, </strong></span><br /><span style="color: #008000;"><strong> // and starting the intent by calling startActivityForResult.</strong></span><br /><span style="color: #008000;"><strong> // Starting the intent prompts the user to select a Google account to sign in with.</strong></span><br /><br /> val signInIntent = mGoogleSignInClient.signInIntent<br /> startActivityForResult.launch(signInIntent)<br /> } else {<br /> Toast.makeText(this, "User already signed-in", Toast.LENGTH_SHORT).show()<br /> }<br /><br /> }<br /><br /> private fun handleSignData(data: Intent?) {<br /><br /> <span style="color: #008000;"><strong> //After the user signs in, you can get a GoogleSignInAccount object for the user,</strong></span><br /><span style="color: #008000;"><strong> //The GoogleSignInAccount object contains information about the signed-in user.</strong></span><br /> GoogleSignIn.getSignedInAccountFromIntent(data)<br /> .addOnCompleteListener {<br /> "isSuccessful ${it.isSuccessful}".print()<br /> if (it.isSuccessful) {<br /> <strong><span style="color: #008000;"> // user successfully logged-in</span></strong><br /> "account ${it.result?.account}".print()<br /> "displayName ${it.result?.displayName}".print()<br /> "Email ${it.result?.email}".print()<br /><br /><span style="color: #008000;"><strong> // start next activity</strong></span><br /> val intent = Intent(this, SecondActivity::class.java)<br /> startActivity(intent)<br /><br /> } else {<br /><strong><span style="color: #008000;"> // authentication failed</span></strong><br /> "exception ${it.exception}".print()<br /> }<br /> }<br /> }<br /><br /> companion object {<br /> const val TAG_MAINACTIVITY = "TAG_MAINACTIVITY"<br /> }<br />}<br /><br />fun Any.print() {<br /> Log.v(MainActivity.TAG_MAINACTIVITY, " $this")<br />}</pre> 
<p>9 . The SecondActivity.kt file contains the logic related to sign-out button functionality and here, we get the information related to the sign-in user and display it in textviews.</p> 
<p><strong><span style="color: #0000ff;">SecondActivity.kt</span></strong></p> 
<pre>class SecondActivity : AppCompatActivity() {<br /><br /> private lateinit var activitySecondBinding: ActivitySecondBinding<br /><br /> override fun onCreate(savedInstanceState: Bundle?) {<br /> super.onCreate(savedInstanceState)<br /> activitySecondBinding = ActivitySecondBinding.inflate(layoutInflater)<br /><br /> setContentView(activitySecondBinding.root)<br /><br /> val account = GoogleSignIn.getLastSignedInAccount(this)<br /> if (account != null) {<br /> activitySecondBinding.pName.text = account.displayName<br /> activitySecondBinding.pEmail.text = account.email<br /> }<br /><br /> activitySecondBinding.btnSignOut.setOnClickListener {<br /> signout()<br /> }<br /> }<br /><br /> private fun signout() {<br /><br /> if (isUserSignedIn(this)) {<br /><br /><span style="color: #008000;"><strong> //clears the account, which is connected to the app</strong></span><br /> getGoogleSigninClient(this@SecondActivity).signOut().addOnCompleteListener {<br /> if (it.isSuccessful) {<br /> Toast.makeText(this@SecondActivity, " Signed out ", Toast.LENGTH_SHORT).show()<br /> <span style="color: #008000;"><strong> //opens login activity</strong></span><br /> val intent = Intent(this, MainActivity::class.java)<br /> startActivity(intent)<br /> } else {<br /> Toast.makeText(this@SecondActivity, " Error ", Toast.LENGTH_SHORT).show()<br /> }<br /> }<br /> }<br /> }<br /><br />}</pre> 
<p>When you run the app it will look like this:</p> 
<p><img class="alignnone wp-image-3018" src="https://c1ctech.com/wp-content/uploads/2022/01/Screenshot_1-473x1024.png" alt="" width="353" height="765" /> <img class="alignnone wp-image-3019" src="https://c1ctech.com/wp-content/uploads/2022/01/Screenshot_2-473x1024.png" alt="" width="351" height="760" />

