Google Login And Registration For Android Using Firebase Authentication
In this tutorial, we will learn how to build simple google login and registration for android using Firebase Authentication. We have added Email & Password login and Google Account login feature.
Firebase automatically stores user information in the database. Login with the google feature is best as you can enter the apps without entering the email and password.
Why Google Login and Registration?
1. User Convenience: Google Login eliminates the need for users to create and remember multiple usernames and passwords making the onboarding process smoother and faster.
2. Increased Security: Firebase Authentication utilizes Google’s secure infrastructure which provide robust protection against unauthorized access and data breaches.
Google Login and registration for Android Using Firebase Authentication
1. Enabling Firebase Auth
1. Go to the android studio and click Tools ⇒ Firebase. Then click on the Authentication tab.
2. Click on the Connect to firebase option.
3. If you are creating a new project then you have to give a new project name otherwise you can select the project you have made.
4. Then you have to select the second option to add firebase authentication to your app. Click on apply changes. This adds plugins and implementation in your Gradle file.
Read More: How to implement Android Splash Screen
2. Enable Authentication Feature
1. Go to the site firebase.google.com.You have to select the authentication tab, then click on the sign-in method.
2. Enable both the option Email/password and Google.
3. Creating an Android Project
1. Open Android Studio, go to File ⇒ New Project and fill all the details.
2. Open AndroidManifest.xml file and Internet permission to your app.
<uses-permission android:name="android.permission.INTERNET" />
3. Gradle and plugin will add automatically when you do Step 1.
4. On the Home_Screen.java add the following code. This code will execute when the user will successfully sign in to an application.
package com.androidhire.loginwithfirebase;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import com.androidhire.loginwithfirebase.databinding.HomeScreenActivityBinding;
import com.google.firebase.auth.FirebaseAuth;
public class Home_screen extends AppCompatActivity {
private FirebaseAuth mAuth;
private HomeScreenActivityBinding binding;
@Override
protected void onStart() {
super.onStart();
mAuth.addAuthStateListener(authStateListener);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = HomeScreenActivityBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
mAuth = FirebaseAuth.getInstance();
binding.signout.setOnClickListener(v -> mAuth.signOut());
}
private final FirebaseAuth.AuthStateListener authStateListener = firebaseAuth -> {
if (firebaseAuth.getCurrentUser() == null) {
startActivity(new Intent(Home_screen.this, singin_activity.class));
}
};
}
5. Create a new activity and name that activity signin.java and add the following code to that java file.
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.google.android.gms.auth.api.signin.GoogleSignIn;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInClient;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.ApiException;
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 singin_activity extends AppCompatActivity {
private static final String TAG = "";
private EditText inputEmail, inputPassword;
private FirebaseAuth mAuth;
private ProgressBar progressBar;
SignInButton button;
private final static int RC_SIGN_IN = 123;
GoogleSignInClient mGoogleSignInClient;
FirebaseAuth.AuthStateListener mAuthListner;
@Override
protected void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListner);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mAuth = FirebaseAuth.getInstance();
//check the current user
if (mAuth.getCurrentUser() != null) {
startActivity(new Intent(singin_activity.this, Home_screen.class));
finish();
}
setContentView(R.layout.activity_singin_activity);
inputEmail = (EditText) findViewById(R.id.email);
inputPassword = (EditText) findViewById(R.id.password);
Button ahlogin = (Button) findViewById(R.id.ah_login);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
TextView btnSignIn = (TextView) findViewById(R.id.sign_in_button);
button = (SignInButton) findViewById(R.id.sign_in_google);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(singin_activity.this, singup_activity.class));
}
});
mAuth = FirebaseAuth.getInstance();
// Checking the email id and password is Empty
ahlogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = inputEmail.getText().toString();
final String password = inputPassword.getText().toString();
if (TextUtils.isEmpty(email)) {
Toast.makeText(getApplicationContext(), "Please enter email id", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getApplicationContext(), "Enter Password", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
//authenticate user
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(singin_activity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE);
if (task.isSuccessful()) {
// there was an error
Log.d(TAG, "signInWithEmail:success");
Intent intent = new Intent(singin_activity.this, Home_screen.class);
startActivity(intent);
finish();
} else {
Log.d(TAG, "singInWithEmail:Fail");
Toast.makeText(singin_activity.this, getString(R.string.failed), Toast.LENGTH_LONG).show();
}
}
});
}
});
mAuthListner = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() != null) {
startActivity(new Intent(singin_activity.this, Home_screen.class));
}
}
};
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
}
private void signIn() {
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
// Google Sign In was successful, authenticate with Firebase
GoogleSignInAccount account = task.getResult(ApiException.class);
firebaseAuthWithGoogle(account);
} catch (ApiException e) {
// Google Sign In failed, update UI appropriately
Log.w(TAG, "Google sign in failed", e);
// ...
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
//updateUI(user);
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "signInWithCredential:failure", task.getException());
Toast.makeText(singin_activity.this, "Aut Fail", Toast.LENGTH_SHORT).show();
//updateUI(null);
}
// ...
}
});
}
}
6. Create a new activity call it signup_activity.java. Add the below code to the java file.
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
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 singup_activity extends AppCompatActivity {
private EditText name, email_id, passwordcheck;
private FirebaseAuth mAuth;
private static final String TAG = "";
private ProgressBar progressBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_singup_activity);
TextView btnSignUp = (TextView) findViewById(R.id.login_page);
btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(singup_activity.this, singin_activity.class);
startActivity(intent);
}
});
mAuth = FirebaseAuth.getInstance();
email_id = (EditText) findViewById(R.id.input_email);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
passwordcheck = (EditText) findViewById(R.id.input_password);
Button ahsignup = (Button) findViewById(R.id.btn_signup);
ahsignup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String email = email_id.getText().toString();
String password = passwordcheck.getText().toString();
if (TextUtils.isEmpty(email)) {
Toast.makeText(getApplicationContext(), "Enter Eamil Id", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.isEmpty(password)) {
Toast.makeText(getApplicationContext(), "Enter Password", Toast.LENGTH_SHORT).show();
return;
}
progressBar.setVisibility(View.VISIBLE);
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(singup_activity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE);
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "createUserWithEmail:success");
FirebaseUser user = mAuth.getCurrentUser();
Intent intent = new Intent(singup_activity.this, Home_screen.class);
startActivity(intent);
finish();
} else {
// If sign in fails, display a message to the user.
Log.w(TAG, "createUserWithEmail:failure", task.getException());
Toast.makeText(singup_activity.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
}
7. In the signin_activity.xml add the following code to your file. Through this user can log in to the application using google or email and password.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp"
tools:context=".singin_activity">
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_gravity="center"
android:contentDescription="@string/image"
android:minHeight="0dp"
android:minWidth="0dp"
android:scaleType="fitCenter"
android:src="@drawable/images" />
<EditText
android:id="@+id/email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:hint="@string/email_id"
android:inputType="textEmailAddress"
android:textColor="@android:color/black"
android:textColorHint="@android:color/darker_gray" />
<EditText
android:id="@+id/password"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp"
android:hint="@string/password"
android:inputType="textPassword"
android:textColor="@android:color/black"
android:textColorHint="@android:color/darker_gray" />
<!-- Login Button -->
<Button
android:id="@+id/ah_login"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:background="@color/colorAccent"
android:text="@string/login"
android:textColor="@android:color/black" />
<TextView
android:gravity="center"
android:id="@+id/sign_in_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="20dip"
android:background="@null"
android:text="@string/create_a_new_account"
android:textAllCaps="false"
android:textSize="15sp" />
<com.google.android.gms.common.SignInButton
android:paddingTop="10dp"
android:id="@+id/sign_in_google"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center|bottom"
android:layout_marginBottom="20dp"
android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>
8. Add XML code to singup_activity.xml. In this user can create a new account using Email and password. If the email exists then it will not create a new account.
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="24dp"
android:paddingRight="24dp"
android:paddingTop="56dp">
<!-- Email Label -->
<EditText
android:id="@+id/input_email"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Email"
android:inputType="textEmailAddress" />
<!-- Password Label -->
<EditText
android:id="@+id/input_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Password"
android:inputType="textPassword" />
<!-- Signup Button -->
<Button
android:id="@+id/btn_signup"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:layout_marginTop="24dp"
android:padding="12dp"
android:text="Create Account" />
<TextView
android:id="@+id/login_page"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="24dp"
android:gravity="center"
android:text="Already a member? Login"
android:textSize="16dip" />
</LinearLayout>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_gravity="center|bottom"
android:layout_marginBottom="20dp"
android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>
9. In this Homepage.xml layout, I have shown normal text and button for logout.
<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
android:padding="24dp"
tools:context=".Home_screen">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingExtra="8sp"
android:text="After Login "
android:textSize="36sp"
android:textStyle="bold" />
<Button
android:id="@+id/signout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="LogOut" />
</LinearLayout>
If you are facing any issues in this google login and registration for android using firebase tutorial then you can reach us through the comment, we will try to solve your queries.