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.
Features of Firebase
Firebase comes with bunch features essential for every android app starting from authentication to hosting the app.
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.
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.
If you login to Firebase console, you can see the user created with the email id you have given the android app.
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.
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); } }); } }); } }
Here is the password reset email user will receive.
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); } } }
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.
Hi there! I am Founder at androidhive and programming enthusiast. My skills includes Android, iOS, PHP, Ruby on Rails and lot more. If you have any idea that you would want me to develop? Let’s talk: ravi@androidhive.info
Thanks Ravi, was really waiting for this!
But what if you want to store more details about the user take for example profilepic
You need to createUser() – instead of creating him with email and password alone.
I dont understand, you mean I should create a function called createUser() that stores in a separate database and host?
No, Firebase provides createUser() method. Check their docs.
Please Ravibhai upload chat and database sample of firebase and XMPP
It would be very big project. You can follow my older article using GCM and convert it to firebase
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?
It can be, but you need to pay for the hosting space / file space.
just like you need to pay for hosting and space on digital ocean too…Thanks for the Clarification
Yeah, but you can prefer using Google Services as they much reliable and faster.
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!
Have you added the dependencies in both the build.gradle files? (as shown in 4 & 5th points)
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
Thanks Ravi bro
How can i send verification email when user register?
i read doc but don’t find for android.
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
Thanks for reply (Y) !!!
thanks Ravi for research this technology and post out.
You are welcome Ralry 🙂
If our app has a lot of users like in thousands then is it free for registering/login services for all users?
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.
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
You want to list all the registered users in android app?
Yes. Could you help me?
Yes, any way to do that?
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
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
Just remove the attributes that are causing the errors. They are not important, your application will run just fine.
Check the .R import statement at the top.
where to check actually i am beginner
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
Hello !
Thanks again Sir for this tremendous work.
Regards
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!
Check the logcat for errors.
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 ?
waw its complette
Hi Ravi can you write on storing binary files on Firebase(images and files)they are now supporting it..,
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?
Appear to me in logcat [FirebaseApp initialization unsuccessful] i use your source code , and change google-server.json , what is the problam
does it tell you what line this error occurred on in the LogCat?
I post all descripation here .
http://stackoverflow.com/q/38000945/4551515
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/
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’
what package name did you use when creating the application?
Nice tutorial, would love to request you for an tutorial on FCM, https://support.google.com/googleplay/android-developer/answer/2663268
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
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
Hey can you make a tutorial on how to make a booking calendar on an android app
Do you mean calendar view or calendar event ?
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.
CustomCalendarView in android should serve your purpose. Checkout this example http://stacktips.com/tutorials/android/custom-calendar-view-library-in-android
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
Hi Walla
Can you tell me what it is. So that I can correct it.
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
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”
Yeah, It is copy / paste error. But it won’t cause any problem.
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.
Always the best bro
The download source code does not work. It goes to the download page but nothing gets downloaded, even if you logged in.
Thanks.
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).
Check your gradle files to see if have properly imported everything or not.
I already checked it everything is fine as described here.
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!
are you have any idea to how push notification from android to android device by using firebase push notification
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
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();
Just comment out any one.
Heyyy… I am getting an error while gradle sync.
It shows Failed to resolve: com.google.firebase.firebase-auth:9.0.2
please help
It seems that u haven’t installed the “Google Repository”
First install it in the SDKmanager>Extras>GoogleRepository
i think this is maybe my android studio version 2.1.2 ??
It doesn’t matter in what version you are developing
I’m also using the sae version
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?
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!
“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]]”
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
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);
import com.google.firebase.auth.FirebaseAuth;
Getting an error on FIREBASEAUTH.
PLZ help me on this
First u have to install the “Google Repository” in the SDK manager then rebuild the project
can’t resolve com.google.firebase.auth.FirebaseAuth ?????
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……..😃
i think this is maybe my android studio version 2.1.2 ??????
Another great tutorial……..thank you
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
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.
Nice tutorial Ravi, @rahuldeewan:disqus , you can get an idea on how to do it here http://inducesmile.com/android/android-firebase-email-and-password-login-as-part-of-android-firebase-device-to-device-chat-part-1/
can’t resolve com.google.firebase.auth.FirebaseAuth ?????
compile “com.google.firebase:firebase-auth:9.0.2”
Hi Ravi…great tutorial but could you please come up with loging in with Facebook and simple login tutorial all in one. Thanks
I found some resources in the Internet but its not a clear tutorial. Did you find something better?
plz come with tutorial on FCM,
Error:(15, 0) Could not find property ‘build’ on root project ‘Firebase’.
Again Great Tutorial ,
but can anyone tell how to set our own mail server to reset password .
All mail sever related options are located on the firebase console.
console.firebase.google.com
replace your play-service version by compile ‘com.google.android.gms:play-services-auth:9.0.2’ gradle file
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.
i created account with id asdf@sty.com password asdfghjkl where do i get the reset link how can i see that email
should be on your email you registered with
if it means the account where i got firebase services.json file than no it is not there
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.:)
A simple google search would have sufficed
http://stackoverflow.com/questions/22262463/firebase-how-to-keep-an-android-user-logged-in
On first launch ensure that firebaseUser is exist. only open login activity if firebaseUser is null
Can someone tell me how to implement these account settings in overflow menu?
thanks for this nice tutorial it is working. Can I also store the user name.