With the latest news from Google I/O comes the new and upgraded Firebase. To demonstrate how simplified and easy to use firebase is, we will build a simple login / register (Firebase Authentication) demo using the Firebase Email & Password authentication.

Firebase provides a full set of authentication options out-of-the-box. Firebase automatically stores your users’ credentials securely (using bcrypt) and redundantly (with replication and daily off-site backups). This separates sensitive user credentials from your application data, and lets you focus on the user interface and experience for your app.

android-getting-started-with-firebase

Features of Firebase

Firebase comes with bunch features essential for every android app starting from authentication to hosting the app.

google firebase android features

Below are the advantages using Firebase in general:
> Super easy and quick to implement.
> No server side configuration needed. No PHP Scripts and No Database Designs.
> Realtime update without using GCM.
> Autoscaling built-in
> Can start for free (only need to start paying once we hit 50 connections)
> Robust APIs for Javascript (including several frameworks like Angular), iOS, and Android
> Built-in support for authentication services like Facebook, Google, and Twitter
> Declarative Security Rules model allows us to enforce read/write privileges and data validation throughout the tree

Some of the disadvantages of Firebase can be sum up in the following:
> Need to build indexes manually
> May need to build “event log” manually as well (in separate sub-tree?)
> Implementation of REST API could be difficult on embedded platforms
> Data validation rules do not support complex objects directly (you’d need to validate individual child nodes separately)

1. Enabling Firebase Auth

1. First thing you need to do is go to https://firebase.google.com/ and make an account to gain access to their console. After you gain access to the console you can start by creating your first project.

2. Give the package name of your project (mine is info.androidhive.firebase) in which you are going to integrate the Firebase. Here the google-services.json file will be downloaded when you press add app button.

3. Next go to your project dashboard. Find the Auth and click get started. Go to set up sign in method and choose Email & Password and enable it.

android-adding-firebase-to-your-project

Now we are ready to start with our Android project. We are going to create a simple app which contains firebase authentication and profile management. Overall we are going to see how to add Login, Registration, Forgot Password, Change Email, Change Password & finally Sign Out option.

2. Creating Android Project

1. Create a new project in Android Studio from File ⇒ New Project. When it prompts you to select the default activity, select Blank Activity and proceed.

While filling the project details, use the same package name which you gave in firebase console. In my case I am using same info.androidhive.firebase.

2. Open AndroidManifest.xml and add the INTERNET permission as we need to make network calls.

<uses-permission android:name="android.permission.INTERNET" />

3. Paste the google-services.json file to your project’s app folder. This step is very important as your project won’t build without this file.

4. Now open the build.gradle located in project’s home directory and add firebase dependency.

dependencies {
        classpath 'com.android.tools.build:gradle:2.1.2'
        classpath 'com.google.gms:google-services:3.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }

5. Open app/build.gradle and add firebase auth dependency. At the very bottom of the file, add apply plugin: ‘com.google.gms.google-services’

dependencies {
    compile "com.google.firebase:firebase-auth:9.0.2"
}

apply plugin: 'com.google.gms.google-services'

6. Add the below resources to dimens.xml, colors.xml and strings.xml. These resources doesn’t require for firebase, but for this article.

<resources>
    <!-- Default screen margins, per the Android Design guidelines. -->
    <dimen name="activity_horizontal_margin">16dp</dimen>
    <dimen name="activity_vertical_margin">16dp</dimen>
    <dimen name="fab_margin">16dp</dimen>
    <dimen name="logo_w_h">100dp</dimen>
</resources>

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#00bcd4</color>
    <color name="colorPrimaryDark">#0097a7</color>
    <color name="colorAccent">#f2fe71</color>

    <color name="bg_login">#26ae90</color>
    <color name="bg_register">#2e3237</color>
    <color name="bg_main">#428bca</color>
    <color name="white">#ffffff</color>
    <color name="input_login">#222222</color>
    <color name="input_login_hint">#999999</color>
    <color name="input_register">#888888</color>
    <color name="input_register_bg">#3b4148</color>
    <color name="input_register_hint">#5e6266</color>
    <color name="btn_login">#26ae90</color>
    <color name="btn_login_bg">#eceef1</color>
    <color name="lbl_name">#333333</color>
    <color name="btn_logut_bg">#ff6861</color>
</resources>
<resources>
    <string name="app_name">Firebase Auth</string>
    <string name="action_sign_in_short">Register</string>
    <string name="email">Email</string>
    <string name="minimum_password">Password too short, enter minimum 6 characters!</string>
    <string name="auth_failed">Authentication failed, check your email and password or sign up</string>
    <string name="change_email">Change Email</string>
    <string name="change_password">Change Password</string>
    <string name="send_password_reset_email">Send Password reset email</string>
    <string name="remove_user">Remove user</string>
    <string name="new_pass">New Password</string>
    <string name="title_activity_profile">Firebase</string>
    <string name="title_activity_login">Sign in</string>
    <string name="hint_email">Email</string>
    <string name="hint_password">Password</string>
    <string name="hint_name">Fullname</string>
    <string name="btn_login">LOGIN</string>
    <string name="btn_link_to_register">Not a member? Get registered in Firebase now!</string>
    <string name="btn_link_to_login">Already registered. Login Me!</string>
    <string name="title_activity_reset_password">ResetPasswordActivity</string>
    <string name="btn_forgot_password">Forgot your password?</string>
    <string name="btn_reset_password">Reset Password</string>
    <string name="btn_back"><![CDATA[<< Back]]></string>
    <string name="hint_new_email">New Email</string>
    <string name="btn_change">Change</string>
    <string name="btn_send">Send</string>
    <string name="btn_remove">Remove</string>
    <string name="btn_sign_out">Sign Out</string>
    <string name="lbl_forgot_password">Forgot password?</string>
    <string name="forgot_password_msg">We just need your registered Email Id to sent you password reset instructions.</string>
</resources>

Now we have the project ready with all the dependencies added. Let’s start by adding the sign up screen.

2.1 Sign Up with Email & Password

Sign up screen contains two EditText fields for email and password. And few buttons to navigate to login and forgot password screens.

7. Create an activity named SignupActivity.java and add the following code to the layout file activity_signup.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true"
    tools:context="info.androidhive.firebase.LoginActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/colorPrimaryDark"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin">


        <ImageView
            android:layout_width="@dimen/logo_w_h"
            android:layout_height="@dimen/logo_w_h"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="30dp"
            android:src="@mipmap/ic_launcher" />

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:hint="@string/email"
                android:inputType="textEmailAddress"
                android:maxLines="1"
                android:singleLine="true"
                android:textColor="@android:color/white" />

        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/password"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:focusableInTouchMode="true"
                android:hint="@string/hint_password"
                android:imeActionId="@+id/login"
                android:imeOptions="actionUnspecified"
                android:inputType="textPassword"
                android:maxLines="1"
                android:singleLine="true"
                android:textColor="@android:color/white" />

        </android.support.design.widget.TextInputLayout>

        <Button
            android:id="@+id/sign_up_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorAccent"
            android:text="@string/action_sign_in_short"
            android:textColor="@android:color/black"
            android:textStyle="bold" />

        <Button
            android:id="@+id/btn_reset_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@null"
            android:text="@string/btn_forgot_password"
            android:textAllCaps="false"
            android:textColor="@color/colorAccent" />

        <!-- Link to Login Screen -->

        <Button
            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/btn_link_to_login"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />
    </LinearLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center|bottom"
        android:layout_marginBottom="20dp"
        android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>

8. Open SignupActivity.java and add the following. Firebase provides createUserWithEmailAndPassword() method to create a new user with email and password data.

package info.androidhive.firebase;

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.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
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;

public class SignupActivity extends AppCompatActivity {

    private EditText inputEmail, inputPassword;
    private Button btnSignIn, btnSignUp, btnResetPassword;
    private ProgressBar progressBar;
    private FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_signup);

        //Get Firebase auth instance
        auth = FirebaseAuth.getInstance();

        btnSignIn = (Button) findViewById(R.id.sign_in_button);
        btnSignUp = (Button) findViewById(R.id.sign_up_button);
        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        btnResetPassword = (Button) findViewById(R.id.btn_reset_password);

        btnResetPassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(SignupActivity.this, ResetPasswordActivity.class));
            }
        });

        btnSignIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        btnSignUp.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String email = inputEmail.getText().toString().trim();
                String password = inputPassword.getText().toString().trim();

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (TextUtils.isEmpty(password)) {
                    Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                    return;
                }

                if (password.length() < 6) {
                    Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);
                //create user
                auth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                Toast.makeText(SignupActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);
                                // If sign in fails, display a message to the user. If sign in succeeds
                                // the auth state listener will be notified and logic to handle the
                                // signed in user can be handled in the listener.
                                if (!task.isSuccessful()) {
                                    Toast.makeText(SignupActivity.this, "Authentication failed." + task.getException(),
                                            Toast.LENGTH_SHORT).show();
                                } else {
                                    startActivity(new Intent(SignupActivity.this, MainActivity.class));
                                    finish();
                                }
                            }
                        });

            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        progressBar.setVisibility(View.GONE);
    }
}

Open AndroidManifest.xml and make SignupActivity as launcher activity (temporarily) and test the sign up.

android-firebase-sign-up-screen

If you login to Firebase console, you can see the user created with the email id you have given the android app.

android-firebase-console-new-user

2.2 Log In with Email & Password

Now we’ll add the login screen and check the credentials we have created on sign up screen.

9. Create another activity named LoginActivity.java and add the below code to its layout file activity_login.xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true"
    tools:context="info.androidhive.firebase.LoginActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@color/colorPrimary"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin">


        <ImageView
            android:layout_width="@dimen/logo_w_h"
            android:layout_height="@dimen/logo_w_h"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="30dp"
            android:src="@mipmap/ic_launcher" />

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:hint="@string/hint_email"
                android:inputType="textEmailAddress"
                android:textColor="@android:color/white"
                android:textColorHint="@android:color/white" />
        </android.support.design.widget.TextInputLayout>

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/password"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:hint="@string/hint_password"
                android:inputType="textPassword"
                android:textColor="@android:color/white"
                android:textColorHint="@android:color/white" />
        </android.support.design.widget.TextInputLayout>

        <!-- Login Button -->

        <Button
            android:id="@+id/btn_login"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@color/colorAccent"
            android:text="@string/btn_login"
            android:textColor="@android:color/black" />

        <Button
            android:id="@+id/btn_reset_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@null"
            android:text="@string/btn_forgot_password"
            android:textAllCaps="false"
            android:textColor="@color/colorAccent" />

        <!-- Link to Login Screen -->

        <Button
            android:id="@+id/btn_signup"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@null"
            android:text="@string/btn_link_to_register"
            android:textAllCaps="false"
            android:textColor="@color/white"
            android:textSize="15dp" />
    </LinearLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center|bottom"
        android:layout_marginBottom="20dp"
        android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>

10. Open LoginActivity.java and do the below changes. Firebase provides signInWithEmailAndPassword() method to sign in the user.

package info.androidhive.firebase;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
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;

public class LoginActivity extends AppCompatActivity {

    private EditText inputEmail, inputPassword;
    private FirebaseAuth auth;
    private ProgressBar progressBar;
    private Button btnSignup, btnLogin, btnReset;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //Get Firebase auth instance
        auth = FirebaseAuth.getInstance();

        if (auth.getCurrentUser() != null) {
            startActivity(new Intent(LoginActivity.this, MainActivity.class));
            finish();
        }

        // set the view now
        setContentView(R.layout.activity_login);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        inputEmail = (EditText) findViewById(R.id.email);
        inputPassword = (EditText) findViewById(R.id.password);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        btnSignup = (Button) findViewById(R.id.btn_signup);
        btnLogin = (Button) findViewById(R.id.btn_login);
        btnReset = (Button) findViewById(R.id.btn_reset_password);

        //Get Firebase auth instance
        auth = FirebaseAuth.getInstance();

        btnSignup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, SignupActivity.class));
            }
        });

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this, ResetPasswordActivity.class));
            }
        });

        btnLogin.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(), "Enter email address!", 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
                auth.signInWithEmailAndPassword(email, password)
                        .addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                // If sign in fails, display a message to the user. If sign in succeeds
                                // the auth state listener will be notified and logic to handle the
                                // signed in user can be handled in the listener.
                                progressBar.setVisibility(View.GONE);
                                if (!task.isSuccessful()) {
                                    // there was an error
                                    if (password.length() < 6) {
                                        inputPassword.setError(getString(R.string.minimum_password));
                                    } else {
                                        Toast.makeText(LoginActivity.this, getString(R.string.auth_failed), Toast.LENGTH_LONG).show();
                                    }
                                } else {
                                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                                    startActivity(intent);
                                    finish();
                                }
                            }
                        });
            }
        });
    }
}

11. Open AndroidManifest.xml and make the LoginActivity.java as launcher activity to make the login screen as first screen.

Run the project and login with the credentials which you used while signing up.

android-firebase-login-screen

2.3 Forgot Password – Send Reset Password Email

Another cool feature firebase provides is, sending reset password email when required. This is a very difficult task if you want to have your own email server.

12. Create another activity named ResetPasswordActivity.java and add the below code its layout file activity_reset_password.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:layout_gravity="center"
    android:background="@color/colorPrimary"
    android:fitsSystemWindows="true"
    tools:context="info.androidhive.firebase.LoginActivity">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="@dimen/activity_horizontal_margin">


        <ImageView
            android:layout_width="@dimen/logo_w_h"
            android:layout_height="@dimen/logo_w_h"
            android:layout_gravity="center_horizontal"
            android:layout_marginBottom="10dp"
            android:src="@mipmap/ic_launcher" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:padding="10dp"
            android:text="@string/lbl_forgot_password"
            android:textColor="@android:color/white"
            android:textSize="20dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:gravity="center_horizontal"
            android:padding="@dimen/activity_horizontal_margin"
            android:text="@string/forgot_password_msg"
            android:textColor="@android:color/white"
            android:textSize="14dp" />

        <android.support.design.widget.TextInputLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <EditText
                android:id="@+id/email"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="10dp"
                android:layout_marginTop="20dp"
                android:hint="@string/hint_email"
                android:inputType="textEmailAddress"
                android:textColor="@android:color/white"
                android:textColorHint="@android:color/white" />
        </android.support.design.widget.TextInputLayout>

        <!-- Login Button -->

        <Button
            android:id="@+id/btn_reset_password"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dip"
            android:background="@color/colorAccent"
            android:text="@string/btn_reset_password"
            android:textColor="@android:color/black" />

        <Button
            android:id="@+id/btn_back"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:background="@null"
            android:text="@string/btn_back"
            android:textColor="@color/colorAccent" />

    </LinearLayout>

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="30dp"
        android:layout_height="30dp"
        android:layout_gravity="center|bottom"
        android:layout_marginBottom="20dp"
        android:visibility="gone" />
</android.support.design.widget.CoordinatorLayout>

13. Open ResetPasswordActivity.java add the below code. You can use sendPasswordResetEmail() method to send the password reset email.

package info.androidhive.firebase;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;

public class ResetPasswordActivity extends AppCompatActivity {

    private EditText inputEmail;
    private Button btnReset, btnBack;
    private FirebaseAuth auth;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reset_password);

        inputEmail = (EditText) findViewById(R.id.email);
        btnReset = (Button) findViewById(R.id.btn_reset_password);
        btnBack = (Button) findViewById(R.id.btn_back);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        auth = FirebaseAuth.getInstance();

        btnBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

        btnReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String email = inputEmail.getText().toString().trim();

                if (TextUtils.isEmpty(email)) {
                    Toast.makeText(getApplication(), "Enter your registered email id", Toast.LENGTH_SHORT).show();
                    return;
                }

                progressBar.setVisibility(View.VISIBLE);
                auth.sendPasswordResetEmail(email)
                        .addOnCompleteListener(new OnCompleteListener<Void>() {
                            @Override
                            public void onComplete(@NonNull Task<Void> task) {
                                if (task.isSuccessful()) {
                                    Toast.makeText(ResetPasswordActivity.this, "We have sent you instructions to reset your password!", Toast.LENGTH_SHORT).show();
                                } else {
                                    Toast.makeText(ResetPasswordActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                                }

                                progressBar.setVisibility(View.GONE);
                            }
                        });
            }
        });
    }

}
android-firebase-forgot-password

Here is the password reset email user will receive.

android-firebase-reset-password-email

Below are the quick code snippets to other user functionalities.

Checking User Session

auth = FirebaseAuth.getInstance();
        if (auth.getCurrentUser() != null) {
            // User is logged in
        }

Change Password

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.updatePassword(newPassword.getText().toString().trim())
            .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Toast.makeText(MainActivity.this, "Password is updated!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show();
                progressBar.setVisibility(View.GONE);
            }
        }
    });

Change Email

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

user.updateEmail(newEmail.getText().toString().trim())
            .addOnCompleteListener(new OnCompleteListener<Void>() {
        @Override
        public void onComplete(@NonNull Task<Void> task) {
            if (task.isSuccessful()) {
                Toast.makeText(MainActivity.this, "Email address is updated.", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show();
            }
        }
    });

Deleting Account / User

FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
if (user != null) {
        user.delete()
                .addOnCompleteListener(new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        if (task.isSuccessful()) {
                            Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show();
                        } else {
                            Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });
    }

Sign Out

auth.signOut();

// this listener will be called when there is change in firebase user session
FirebaseAuth.AuthStateListener authListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user == null) {
                    // user auth state is changed - user is null
                    // launch login activity
                    startActivity(new Intent(MainActivity.this, LoginActivity.class));
                    finish();
                }
            }
        };

2.4 Profile Screen – Putting All Together

Now we’ll keep all the above functionalities in main activity and make fully functional app. Open the layout file of main activity activity_main.xml and add the below layout code.

14.Open the activity_main.xml and add the following code.

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 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:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        app:elevation="0dp">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimaryDark"
            app:layout_scrollFlags="scroll|enterAlways"
            app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <EditText
            android:id="@+id/old_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hint_email"
            android:inputType="textEmailAddress"
            android:maxLines="1"
            android:singleLine="true" />

        <EditText
            android:id="@+id/new_email"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hint_new_email"
            android:inputType="textEmailAddress"
            android:maxLines="1"
            android:singleLine="true" />

        <EditText
            android:id="@+id/password"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusableInTouchMode="true"
            android:hint="@string/prompt_password"
            android:imeActionId="@+id/login"
            android:imeOptions="actionUnspecified"
            android:inputType="textPassword"
            android:maxLines="1"
            android:singleLine="true" />

        <EditText
            android:id="@+id/newPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:focusableInTouchMode="true"
            android:hint="@string/new_pass"
            android:imeActionId="@+id/login"
            android:imeOptions="actionUnspecified"
            android:inputType="textPassword"
            android:maxLines="1"
            android:singleLine="true" />

        <Button
            android:id="@+id/changeEmail"
            style="?android:textAppearanceSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimaryDark"
            android:text="@string/btn_change"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

        <Button
            android:id="@+id/changePass"
            style="?android:textAppearanceSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimaryDark"
            android:text="@string/btn_change"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

        <Button
            android:id="@+id/send"
            style="?android:textAppearanceSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimaryDark"
            android:text="@string/btn_send"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

        <ProgressBar
            android:id="@+id/progressBar"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:visibility="gone" />

        <Button
            android:id="@+id/remove"
            style="?android:textAppearanceSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimaryDark"
            android:text="@string/btn_remove"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

        <Button
            android:id="@+id/change_email_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="@string/change_email"
            android:textStyle="bold" />

        <Button
            android:id="@+id/change_password_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="@string/change_password"
            android:textStyle="bold" />

        <Button
            android:id="@+id/sending_pass_reset_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="@string/send_password_reset_email"
            android:textStyle="bold" />

        <Button
            android:id="@+id/remove_user_button"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:text="@string/remove_user"
            android:textStyle="bold" />

        <Button
            android:id="@+id/sign_out"
            style="?android:textAppearanceSmall"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="16dp"
            android:background="@color/colorPrimary"
            android:text="@string/btn_sign_out"
            android:textColor="@android:color/white"
            android:textStyle="bold" />

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

15. Open the MainActivity.java and the following code. Basically here we combine all the functionalities into a single activity.

package info.androidhive.firebase;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class MainActivity extends AppCompatActivity {

    private Button btnChangeEmail, btnChangePassword, btnSendResetEmail, btnRemoveUser,
            changeEmail, changePassword, sendEmail, remove, signOut;

    private EditText oldEmail, newEmail, password, newPassword;
    private ProgressBar progressBar;
    private FirebaseAuth.AuthStateListener authListener;
    private FirebaseAuth auth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(getString(R.string.app_name));
        setSupportActionBar(toolbar);

        //get firebase auth instance
        auth = FirebaseAuth.getInstance();

        //get current user
        final FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();

        authListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user == null) {
                    // user auth state is changed - user is null
                    // launch login activity
                    startActivity(new Intent(MainActivity.this, LoginActivity.class));
                    finish();
                }
            }
        };

        btnChangeEmail = (Button) findViewById(R.id.change_email_button);
        btnChangePassword = (Button) findViewById(R.id.change_password_button);
        btnSendResetEmail = (Button) findViewById(R.id.sending_pass_reset_button);
        btnRemoveUser = (Button) findViewById(R.id.remove_user_button);
        changeEmail = (Button) findViewById(R.id.changeEmail);
        changePassword = (Button) findViewById(R.id.changePass);
        sendEmail = (Button) findViewById(R.id.send);
        remove = (Button) findViewById(R.id.remove);
        signOut = (Button) findViewById(R.id.sign_out);

        oldEmail = (EditText) findViewById(R.id.old_email);
        newEmail = (EditText) findViewById(R.id.new_email);
        password = (EditText) findViewById(R.id.password);
        newPassword = (EditText) findViewById(R.id.newPassword);

        oldEmail.setVisibility(View.GONE);
        newEmail.setVisibility(View.GONE);
        password.setVisibility(View.GONE);
        newPassword.setVisibility(View.GONE);
        changeEmail.setVisibility(View.GONE);
        changePassword.setVisibility(View.GONE);
        sendEmail.setVisibility(View.GONE);
        remove.setVisibility(View.GONE);

        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        if (progressBar != null) {
            progressBar.setVisibility(View.GONE);
        }

        btnChangeEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.GONE);
                newEmail.setVisibility(View.VISIBLE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.GONE);
                changeEmail.setVisibility(View.VISIBLE);
                changePassword.setVisibility(View.GONE);
                sendEmail.setVisibility(View.GONE);
                remove.setVisibility(View.GONE);
            }
        });

        changeEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null && !newEmail.getText().toString().trim().equals("")) {
                    user.updateEmail(newEmail.getText().toString().trim())
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Email address is updated. Please sign in with new email id!", Toast.LENGTH_LONG).show();
                                        signOut();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to update email!", Toast.LENGTH_LONG).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                } else if (newEmail.getText().toString().trim().equals("")) {
                    newEmail.setError("Enter email");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnChangePassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.GONE);
                newEmail.setVisibility(View.GONE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.VISIBLE);
                changeEmail.setVisibility(View.GONE);
                changePassword.setVisibility(View.VISIBLE);
                sendEmail.setVisibility(View.GONE);
                remove.setVisibility(View.GONE);
            }
        });

        changePassword.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null && !newPassword.getText().toString().trim().equals("")) {
                    if (newPassword.getText().toString().trim().length() < 6) {
                        newPassword.setError("Password too short, enter minimum 6 characters");
                        progressBar.setVisibility(View.GONE);
                    } else {
                        user.updatePassword(newPassword.getText().toString().trim())
                                .addOnCompleteListener(new OnCompleteListener<Void>() {
                                    @Override
                                    public void onComplete(@NonNull Task<Void> task) {
                                        if (task.isSuccessful()) {
                                            Toast.makeText(MainActivity.this, "Password is updated, sign in with new password!", Toast.LENGTH_SHORT).show();
                                            signOut();
                                            progressBar.setVisibility(View.GONE);
                                        } else {
                                            Toast.makeText(MainActivity.this, "Failed to update password!", Toast.LENGTH_SHORT).show();
                                            progressBar.setVisibility(View.GONE);
                                        }
                                    }
                                });
                    }
                } else if (newPassword.getText().toString().trim().equals("")) {
                    newPassword.setError("Enter password");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnSendResetEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                oldEmail.setVisibility(View.VISIBLE);
                newEmail.setVisibility(View.GONE);
                password.setVisibility(View.GONE);
                newPassword.setVisibility(View.GONE);
                changeEmail.setVisibility(View.GONE);
                changePassword.setVisibility(View.GONE);
                sendEmail.setVisibility(View.VISIBLE);
                remove.setVisibility(View.GONE);
            }
        });

        sendEmail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (!oldEmail.getText().toString().trim().equals("")) {
                    auth.sendPasswordResetEmail(oldEmail.getText().toString().trim())
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Reset password email is sent!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to send reset email!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                } else {
                    oldEmail.setError("Enter email");
                    progressBar.setVisibility(View.GONE);
                }
            }
        });

        btnRemoveUser.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressBar.setVisibility(View.VISIBLE);
                if (user != null) {
                    user.delete()
                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                @Override
                                public void onComplete(@NonNull Task<Void> task) {
                                    if (task.isSuccessful()) {
                                        Toast.makeText(MainActivity.this, "Your profile is deleted:( Create a account now!", Toast.LENGTH_SHORT).show();
                                        startActivity(new Intent(MainActivity.this, SignupActivity.class));
                                        finish();
                                        progressBar.setVisibility(View.GONE);
                                    } else {
                                        Toast.makeText(MainActivity.this, "Failed to delete your account!", Toast.LENGTH_SHORT).show();
                                        progressBar.setVisibility(View.GONE);
                                    }
                                }
                            });
                }
            }
        });

        signOut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                signOut();
            }
        });

    }

    //sign out method
    public void signOut() {
        auth.signOut();
    }

    @Override
    protected void onResume() {
        super.onResume();
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onStart() {
        super.onStart();
        auth.addAuthStateListener(authListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (authListener != null) {
            auth.removeAuthStateListener(authListener);
        }
    }
}
android-firebase-profile-activity

Now you have the basics for creating a simple login / register app with firebase. You can continue exploring firebase as it offers much more functionalities and it’s fun to use them.

Subscribe
Notify of
guest
545 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Jeffrey Nyauke
Jeffrey Nyauke
4 years ago

Thanks Ravi, was really waiting for this!

Jeffrey Nyauke
Jeffrey Nyauke
4 years ago
Reply to  Jeffrey Nyauke

But what if you want to store more details about the user take for example profilepic

Ravi Tamada
4 years ago
Reply to  Jeffrey Nyauke

You need to createUser() – instead of creating him with email and password alone.

Jeffrey Nyauke
Jeffrey Nyauke
4 years ago
Reply to  Ravi Tamada

I dont understand, you mean I should create a function called createUser() that stores in a separate database and host?

Ravi Tamada
4 years ago
Reply to  Jeffrey Nyauke

No, Firebase provides createUser() method. Check their docs.

Shivraj Vala
Shivraj Vala
4 years ago

Please Ravibhai upload chat and database sample of firebase and XMPP

Ravi Tamada
4 years ago
Reply to  Shivraj Vala

It would be very big project. You can follow my older article using GCM and convert it to firebase

Trey Rosius
Trey Rosius
4 years ago

Hi Ravi, can a client server app like say instagram be created and deployed using just firebase?Using just firebase REST API, no php scripts?

Ravi Tamada
4 years ago
Reply to  Trey Rosius

It can be, but you need to pay for the hosting space / file space.

Trey Rosius
Trey Rosius
4 years ago
Reply to  Ravi Tamada

just like you need to pay for hosting and space on digital ocean too…Thanks for the Clarification

Ravi Tamada
4 years ago
Reply to  Trey Rosius

Yeah, but you can prefer using Google Services as they much reliable and faster.

Sandeep
Sandeep
4 years ago

Hi there!

I could not able to load jar file in my gradle.
compile “com.google.firebase:firebase-auth:9.0.2”
Please help me!

Ravi Tamada
4 years ago
Reply to  Sandeep

Have you added the dependencies in both the build.gradle files? (as shown in 4 & 5th points)

Sandeep
Sandeep
4 years ago
Reply to  Ravi Tamada

I got the Solution My friend. Thank You for response. Here You go the link

http://stackoverflow.com/questions/37310188/failed-to-resolve-com-google-firebasefirebase-core9-0-0

Ravikant paudel
Ravikant paudel
4 years ago

Thanks Ravi bro
How can i send verification email when user register?
i read doc but don’t find for android.

Ravi Tamada
4 years ago

Yeah, I didn’t even find it. Email verification is supported on other firebase platforms but not on android. But here is a solution.

Somebody used password reset feature as email verification. Check andreasmcd answer.
http://stackoverflow.com/questions/17723195/is-there-any-way-to-do-email-confirmation-for-firebase-user-creation-and-or-pass

Ravikant paudel
Ravikant paudel
4 years ago
Reply to  Ravi Tamada

Thanks for reply (Y) !!!

Ralry Ong
Ralry Ong
4 years ago

thanks Ravi for research this technology and post out.

Ravi Tamada
4 years ago
Reply to  Ralry Ong

You are welcome Ralry 🙂

Malik Qirtas Awan
Malik Qirtas Awan
4 years ago

If our app has a lot of users like in thousands then is it free for registering/login services for all users?

Ravi Tamada
4 years ago

Free!
https://firebase.google.com/pricing/

Which products are paid? Which are free?

Firebase’s paid infrastructure products are the Realtime Database, Firebase Storage, Hosting, and Test Lab. We offer a free tier for all of these products except Test Lab.

Firebase also has many free products: Analytics, Notifications, Crash Reporting, Authentication, Remote Config, Dynamic Links, Firebase Invites, and App Indexing. You can use an unlimited amount of these in all plans, including our free Spark Plan.

Danh Nguyễn
Danh Nguyễn
4 years ago

Hi, Ravi Tamada
I want to get list user register account on firebase. Can I get them? I don’t see any document about it

Ravi Tamada
4 years ago
Reply to  Danh Nguyễn

You want to list all the registered users in android app?

Danh Nguyễn
Danh Nguyễn
4 years ago
Reply to  Ravi Tamada

Yes. Could you help me?

Danh Nguyễn
Danh Nguyễn
4 years ago
Reply to  Ravi Tamada

Yes, any way to do that?

Aarav Choudhary
Aarav Choudhary
4 years ago

Hello Sir I have problem in the Login Activity its showing you cannot find the symbol setContentView(R.layout.activity_login);

its showing R in red color

Aarav Choudhary
Aarav Choudhary
4 years ago

D:AndroidFirebaseAppappsrcmainreslayoutactivity_main.xml
Error:(16) No resource identifier found for attribute ‘layout_scrollFlags’ in package ‘info.pradeep.firebaseapp’
Error:(26) No resource identifier found for attribute ‘layout_behavior’ in package ‘info.pradeep.firebaseapp’
Error:(13, 20) No resource found that matches the given name (at ‘theme’ with value ‘@style/AppTheme.AppBarOverlay’).
Error:(22, 25) No resource found that matches the given name (at ‘popupTheme’ with value ‘@style/AppTheme.PopupOverlay’).
Error:(34, 26) No resource found that matches the given name (at ‘layout_behavior’ with value ‘@string/appbar_scrolling_view_behavior’).
Error:(59, 23) No resource found that matches the given name (at ‘hint’ with value ‘@string/prompt_password’).
Error:Execution failed for task ‘:app:processDebugResources’.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘C:UsersAndroidAppDataLocalAndroidSdkbuild-tools24.0.0aapt.exe” finished with non-zero exit value 1

Dheeraj Parashar
Dheeraj Parashar
4 years ago

Just remove the attributes that are causing the errors. They are not important, your application will run just fine.

Ravi Tamada
4 years ago

Check the .R import statement at the top.

Aarav Choudhary
Aarav Choudhary
4 years ago
Reply to  Ravi Tamada

where to check actually i am beginner

Aarav Choudhary
Aarav Choudhary
4 years ago
Reply to  Ravi Tamada

Error:(11) No resource identifier found for attribute ‘layout_behavior’ in package ‘info.pradeep.firebaseapp’
Error:(19, 26) No resource found that matches the given name (at ‘layout_behavior’ with value ‘@string/appbar_scrolling_view_behavior’).
Error:Execution failed for task ‘:app:processDebugResources’.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process ‘command ‘C:UsersAndroidAppDataLocalAndroidSdkbuild-tools24.0.0aapt.exe” finished with non-zero exit value 1

what does these means

Abdel
Abdel
4 years ago

Hello !
Thanks again Sir for this tremendous work.
Regards

Edward
Edward
4 years ago

Hi Ravi,

Great tutorial! Unfortunately however it doesn’t cover for someone signing up with the same email…it crashes. I thought I’d just let you know.

Thanks again!

Ravi Tamada
4 years ago
Reply to  Edward

Check the logcat for errors.

sunny
sunny
4 years ago

HI,
could you please show me a way to start work on developing android antivirus.

or can you help me to give a basi idea and flow to start work on it. like basic concepts and basic keywords to search on google ?

wisnu kurniawan
wisnu kurniawan
4 years ago

waw its complette

Macharia
Macharia
4 years ago

Hi Ravi can you write on storing binary files on Firebase(images and files)they are now supporting it..,

Naqib Shayea Qazizadah
Naqib Shayea Qazizadah
4 years ago

Hi Ravi thanks for nice tutorials bro I want to know if I can implement this login and register method on my existing application? In my application after the user logs in he can post something and it goes to my own server.
I want to know if this is good for this kind of application?

omar
omar
4 years ago

Appear to me in logcat [FirebaseApp initialization unsuccessful] i use your source code , and change google-server.json , what is the problam

Manny264
Manny264
4 years ago
Reply to  omar

does it tell you what line this error occurred on in the LogCat?

omar
omar
4 years ago
Reply to  Manny264

I post all descripation here .
http://stackoverflow.com/q/38000945/4551515

Sandeep
Sandeep
4 years ago

Great tutorial to start with Firebase. Firebase also supports Google and Facebook Login i guess. Found a good tutorial on Firebase facebbok Login. http://androidbash.com/firebase-facebook-login-tutorial-android/

Manish Kumar
Manish Kumar
4 years ago

Hey Ravi, Nice tutorial. Thanks . But i am getting an error.

FAILURE: Build failed with an exception.

* What went wrong:

Execution failed for task ‘:app:processDebugGoogleServices’.

> No matching client found for package name ‘info.androidhive.welcomeslider’

Manny264
Manny264
4 years ago
Reply to  Manish Kumar

what package name did you use when creating the application?

Rivu
4 years ago

Nice tutorial, would love to request you for an tutorial on FCM, https://support.google.com/googleplay/android-developer/answer/2663268

Nidhin Kumar
Nidhin Kumar
4 years ago

Hi ravi,
I was just waiting for this tutorial can we expect somemore tutorials using firebase like inserting the datas as well as reading those datas from firebase

pm abi
pm abi
4 years ago

Has any of your applications ever hit 50 concurrent connections hard limit while using the free spark plan??
The out of the box solutions looks promising for porting my application right away..But concerned of this small problem

Manish Kumar
Manish Kumar
4 years ago

Hey can you make a tutorial on how to make a booking calendar on an android app

StackTips
4 years ago
Reply to  Manish Kumar

Do you mean calendar view or calendar event ?

Manish Kumar
Manish Kumar
4 years ago
Reply to  StackTips

Lets say my customer has taken food subscription for a month. they want to cancel few days out of that . A calendar to do that and they should not be able to pick up a date before todays date. any date before todays date should be blacked out , so that customers cannot select those dates.

StackTips
4 years ago
Reply to  Manish Kumar

CustomCalendarView in android should serve your purpose. Checkout this example http://stacktips.com/tutorials/android/custom-calendar-view-library-in-android

Walaa' Hamdy Assy
Walaa' Hamdy Assy
4 years ago

there are one replication and a simple mistake that could confuse some of us in the login activity and some xml files at tools:context
appreciate it

Ravi Tamada
4 years ago

Hi Walla

Can you tell me what it is. So that I can correct it.

Walaa' Hamdy Assy
Walaa' Hamdy Assy
4 years ago
Reply to  Ravi Tamada

hi ravi. they are just in the article the apk and completed code work just fine
i will take some snapshots and highlight the errors , but where to post them?
eg: the tools context in some layout files refer to another activity not the right one

Urja Pawar
Urja Pawar
4 years ago
Reply to  Ravi Tamada

Hi Ravi!, the correction is -> In xml of ResetPasswordActivity, it should be tools:context=”info.androidhive.firebase.ResetPasswordActivity” instead of tools:context=”info.androidhive.firebase.LoginActivity”

Ravi Tamada
4 years ago
Reply to  Urja Pawar

Yeah, It is copy / paste error. But it won’t cause any problem.

venkatesh
venkatesh
4 years ago

Great tutorial:)
Can you help me with this error:
i cant move to the signup page from login page on clicking”get registered in Firebase” button.It says Null pointer exception:trying to invoke virtual method ‘void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)’ on a null object reference in the logcat.Everything else works fine.

Aiman Baharum
Aiman Baharum
4 years ago

Always the best bro

Podster
Podster
4 years ago

The download source code does not work. It goes to the download page but nothing gets downloaded, even if you logged in.

Thanks.

Abhishek Kumar
Abhishek Kumar
4 years ago

Sir,

I am using fragment for the designing of the firebase simple login registration.

I get error in the OnCreateView() method on initializing

auth = FirebaseAuth.getInstance();

error:- Error:(58, 28) error: cannot access zzaja
class file for com.google.android.gms.internal.zzaja not found.

please help on this(stick for more than an hour).

Dheeraj Parashar
Dheeraj Parashar
4 years ago
Reply to  Abhishek Kumar

Check your gradle files to see if have properly imported everything or not.

Abhishek Kumar
Abhishek Kumar
4 years ago

I already checked it everything is fine as described here.

Amar Bakir
Amar Bakir
4 years ago
Reply to  Abhishek Kumar

I solved this exact problem today and stumbled onto this unanswered question by chance during the process.

First, ensure you’ve properly setup Firebase for Android as documented here: https://firebase.google.com/docs/android/setup. Then, make sure you are compiling the latest version of the Firebase APIs (9.2.0) and the Google Play Services APIs (9.2.0) that you are using. My gradle dependencies look something like this:

dependencies {

compile ‘com.google.android.gms:play-services-location:9.2.0’
compile ‘com.google.firebase:firebase-core:9.2.0’
compile ‘com.google.firebase:firebase-auth:9.2.0’
compile ‘com.google.firebase:firebase-messaging:9.2.0’
}

Hope this helps!

Mostafa Anter
Mostafa Anter
4 years ago

are you have any idea to how push notification from android to android device by using firebase push notification

Ravi Kumar
Ravi Kumar
4 years ago

its a kind request , you have till now tought us about how to log in and all . it will b very helpfull if u can show how to set up user profile after that . means login in though email id and password after that a create profile page in which we let them set their images and name and store all the information on database

atul o holic
atul o holic
4 years ago

Awesome tutorial man. Cheers to you and Thank you 🙂

Just a small thing which I found, the below piece of code is called twice in the LoginActivity class, not sure if its there purposely.

//Get Firebase auth instance
auth = FirebaseAuth.getInstance();

PINKesh Darji
PINKesh Darji
4 years ago
Reply to  atul o holic

Just comment out any one.

MITEN SHAH
MITEN SHAH
4 years ago

Heyyy… I am getting an error while gradle sync.
It shows Failed to resolve: com.google.firebase.firebase-auth:9.0.2
please help

Praneeth Chowdary
Praneeth Chowdary
4 years ago
Reply to  MITEN SHAH

It seems that u haven’t installed the “Google Repository”
First install it in the SDKmanager>Extras>GoogleRepository

MoHit KaUsh!k
MoHit KaUsh!k
4 years ago

i think this is maybe my android studio version 2.1.2 ??

Praneeth Chowdary
Praneeth Chowdary
4 years ago
Reply to  MoHit KaUsh!k

It doesn’t matter in what version you are developing
I’m also using the sae version

Afif FirZil
Afif FirZil
4 years ago

Hai sir, how can we know that database in firebase cloud has been changed while the app is in background or inactive? how to give notification to device while user not open the app if there is new data?

Eyal Engel
Eyal Engel
4 years ago

Hi Ravi, amazing guide! I learned a lot, thank you!
One question please – if I have a facebook Login button – then how do you I save the user in Firebase? I only have his email but not a password.
Thanks!

Urja Pawar
Urja Pawar
4 years ago

“Failed to update email”, I am not able to update email and password , it shows this error “Failed to load module descriptor class: Didn’t find class “com.google.android.gms.dynamite.descriptors.com.google.firebase.auth.ModuleDescriptor” on path: DexPathList[[zip file “/data/app/com.urjapawar.assistodo-1/base.apk”],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]”

Izi
Izi
4 years ago

Hi Ravi thanks for your really great tutorial, I am having this issue when I try to make a build: Error:(45, 54) error: cannot find symbol variable toolbar, the error is located in LoginActivity.java with the code : Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); thanks for your help

PINKesh Darji
PINKesh Darji
4 years ago
Reply to  Izi

This is because you have no toolbar with id toolbar in layout xml file.
Comment out both line in LoginActivity.java and you are done.
// Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
// setSupportActionBar(toolbar);

Dilpreet
Dilpreet
4 years ago

import com.google.firebase.auth.FirebaseAuth;
Getting an error on FIREBASEAUTH.
PLZ help me on this

Praneeth Chowdary
Praneeth Chowdary
4 years ago
Reply to  Dilpreet

First u have to install the “Google Repository” in the SDK manager then rebuild the project

Mohit
Mohit
4 years ago

can’t resolve com.google.firebase.auth.FirebaseAuth ?????

Praneeth Chowdary
Praneeth Chowdary
4 years ago
Reply to  Mohit

U have to the add the following code
dependencies {
compile ‘com.firebase:firebase-client-android:2.5.2+’
}

In the build.gradle
Then rebuild the project
If this doesn’t help you feel free to ask……..😃

MoHit KaUsh!k
MoHit KaUsh!k
4 years ago

i think this is maybe my android studio version 2.1.2 ??????

Prashant
Prashant
4 years ago

Another great tutorial……..thank you

Praneeth Chowdary
Praneeth Chowdary
4 years ago

When I click the Register Button and Login me Button the app closes is there any solution for it……?
can anyone provide the manifest file for this application

Rahul Deewan
Rahul Deewan
4 years ago

Hello Ravi. Thanks for a very good tutorial. I would like to know one thing that how to store user profile in Firebase database along with the user’s Email and Password.

Tosca
Tosca
4 years ago
Reply to  Rahul Deewan
Mohit
Mohit
4 years ago

can’t resolve com.google.firebase.auth.FirebaseAuth ?????

Cristian Gonzalez
Cristian Gonzalez
4 years ago
Reply to  Mohit

compile “com.google.firebase:firebase-auth:9.0.2”

Nick Theinvincibleprints
Nick Theinvincibleprints
4 years ago

Hi Ravi…great tutorial but could you please come up with loging in with Facebook and simple login tutorial all in one. Thanks

Junie Negentien
Junie Negentien
4 years ago

I found some resources in the Internet but its not a clear tutorial. Did you find something better?

Mary Mathew
Mary Mathew
4 years ago

plz come with tutorial on FCM,

Ayush Shrivastava
Ayush Shrivastava
4 years ago

Error:(15, 0) Could not find property ‘build’ on root project ‘Firebase’.

nikhil bhoyar
nikhil bhoyar
4 years ago

Again Great Tutorial ,
but can anyone tell how to set our own mail server to reset password .

sar
sar
4 years ago
Reply to  nikhil bhoyar

All mail sever related options are located on the firebase console.
console.firebase.google.com

neelam
neelam
4 years ago

replace your play-service version by compile ‘com.google.android.gms:play-services-auth:9.0.2’ gradle file

Aniket
Aniket
4 years ago

Sir, DefaultHttpClient is not working in SDK version 23 , buildToolsVersion 23.0.3 and using Marshmallow 6.0. Please suggest the correct way to handle this.

dhruv thakker
dhruv thakker
4 years ago

i created account with id asdf@sty.com password asdfghjkl where do i get the reset link how can i see that email

sar
sar
4 years ago
Reply to  dhruv thakker

should be on your email you registered with

dhruv thakker
dhruv thakker
4 years ago
Reply to  sar

if it means the account where i got firebase services.json file than no it is not there

Purvik Rana
Purvik Rana
4 years ago

I have put Firebase Authentication in one of my application. Now what i’m facing, every time when i close my app and ope it again, it will popup login window again. What that means actually!! Is it signing out the user when we close the application? Reply with the Answer ASAP.:)

ÑäMàñ Arora
ÑäMàñ Arora
4 years ago
Reply to  Purvik Rana
King Kazma
King Kazma
4 years ago
Reply to  Purvik Rana

On first launch ensure that firebaseUser is exist. only open login activity if firebaseUser is null

Ayush
Ayush
4 years ago

Can someone tell me how to implement these account settings in overflow menu?

artye
artye
4 years ago

thanks for this nice tutorial it is working. Can I also store the user name.

545
0
Would love your thoughts, please comment.x
()
x