title: How do I add the user to the Firebase Platform
body: <p>I have been trying to add the user to the firebase platform whenever the "register" button is clicked, creating the user, that, afterwords will be authenticated, with an email and password login in System, although, never succeeded. What do I have to add to my code? Any help will be much appreciated.</p>
  
  <pre><code>@Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_login);
      // Set up the login form.
      mEmailView = findViewById( R.id.email );
      populateAutoComplete();
      mPasswordView = findViewById( R.id.password );
      mPasswordView.setOnEditorActionListener( new TextView.OnEditorActionListener() {
          @Override
          public boolean onEditorAction(TextView textView, int id, KeyEvent keyEvent) {
              if (id == EditorInfo.IME_ACTION_DONE || id == EditorInfo.IME_NULL) {
                  attemptLogin();
                  return true;
              }
              return false;
  
          }
      } );
  
      mLoginFormView = findViewById( R.id.login_form );
      mProgressView = findViewById( R.id.login_progress );
  
      mAuth = FirebaseAuth.getInstance();
      firebaseAuth = FirebaseAuth.getInstance();
  
    mAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null ) {
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
            } else {
                Log.d( TAG, "onAuthStateChanged:signed_out:");
            }
  
        }
    };
  
  
  
  
  
  
  }
  
  
  
  @Override
  public void onStart() {
      super.onStart();
      firebaseAuth.addAuthStateListener( mAuthStateListener );
      FirebaseUser currentUser = mAuth.getCurrentUser();
      updateUI(currentUser);
  
  }
  
  @Override
  public void onStop() {
      super.onStop();
      if (mAuthStateListener != null) {
          mAuth.removeAuthStateListener( mAuthStateListener );
      }
  }
  
  
  
  private void updateUI(FirebaseUser currentUser) {
  }
  
  
  private void populateAutoComplete() {
      if (!mayRequestContacts()) {
          return;
      }
  
      getLoaderManager().initLoader( 0, null, this );
  }
  
  private boolean mayRequestContacts() {
      if (Build.VERSION.SDK_INT &lt; Build.VERSION_CODES.M) {
          return true;
      }
      if (checkSelfPermission( READ_CONTACTS ) == PackageManager.PERMISSION_GRANTED) {
          return true;
      }
      if (shouldShowRequestPermissionRationale( READ_CONTACTS )) {
          Snackbar.make( mEmailView, R.string.permission_rationale, Snackbar.LENGTH_INDEFINITE )
                  .setAction( android.R.string.ok, new View.OnClickListener() {
                      @Override
                      @TargetApi(Build.VERSION_CODES.M)
                      public void onClick(View v) {
                          requestPermissions( new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS );
                      }
                  } );
      } else {
          requestPermissions( new String[]{READ_CONTACTS}, REQUEST_READ_CONTACTS );
      }
      return false;
  }
  
  /**
   * Callback received when a permissions request has been completed.
   */
  @Override
  public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
                                         @NonNull int[] grantResults) {
      if (requestCode == REQUEST_READ_CONTACTS) {
          if (grantResults.length == 1 &amp;&amp; grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              populateAutoComplete();
          }
      }
  }
  
  
  /**
   * Attempts to sign in or register the account specified by the login form.
   * If there are form errors (invalid email, missing fields, etc.), the
   * errors are presented and no actual login attempt is made.
   */
  private void attemptLogin() {
      if (mAuthTask != null) {
          return;
      }
  
      // Reset errors.
      mEmailView.setError( null );
      mPasswordView.setError( null );
  
      // Store values at the time of the login attempt.
      String email = mEmailView.getText().toString();
      String password = mPasswordView.getText().toString();
  
      boolean cancel = false;
      View focusView = null;
  
      // Check for a valid password, if the user entered one.
      if (!TextUtils.isEmpty( password ) &amp;&amp; !isPasswordValid( password )) {
          mPasswordView.setError( getString( R.string.error_invalid_password ) );
          focusView = mPasswordView;
          cancel = true;
      }
  
      // Check for a valid email address.
      if (TextUtils.isEmpty( email )) {
          mEmailView.setError( getString( R.string.error_field_required ) );
          focusView = mEmailView;
          cancel = true;
      } else if (!isEmailValid( email )) {
          mEmailView.setError( getString( R.string.error_invalid_email ) );
          focusView = mEmailView;
          cancel = true;
      }
  
      if (cancel) {
          // There was an error; don't attempt login and focus the first
          // form field with an error.
          focusView.requestFocus();
      } else {
          // Show a progress spinner, and kick off a background task to
          // perform the user login attempt.
          showProgress( true );
          mAuthTask = new UserLoginTask( email, password );
          mAuthTask.execute( (Void) null );
      }
  }
  
  private boolean isEmailValid(String email) {
      //TODO: Replace this with your own logic
      return email.contains( "@" );
  }
  
  private boolean isPasswordValid(String password) {
      //TODO: Replace this with your own logic
      return password.length() &gt; 4;
  }
  
  /**
   * Shows the progress UI and hides the login form.
   */
  @SuppressLint("ObsoleteSdkInt")
  @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
  private void showProgress(final boolean show) {
      // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
      // for very easy animations. If available, use these APIs to fade-in
      // the progress spinner.
      if (Build.VERSION.SDK_INT &gt;= Build.VERSION_CODES.HONEYCOMB_MR2) {
          int shortAnimTime = getResources().getInteger( android.R.integer.config_shortAnimTime );
  
          mLoginFormView.setVisibility( show ? View.GONE : View.VISIBLE );
          mLoginFormView.animate().setDuration( shortAnimTime ).alpha(
                  show ? 0 : 1 ).setListener( new AnimatorListenerAdapter() {
              @Override
              public void onAnimationEnd(Animator animation) {
                  mLoginFormView.setVisibility( show ? View.GONE : View.VISIBLE );
              }
          } );
  
          mProgressView.setVisibility( show ? View.VISIBLE : View.GONE );
          mProgressView.animate().setDuration( shortAnimTime ).alpha(
                  show ? 1 : 0 ).setListener( new AnimatorListenerAdapter() {
              @Override
              public void onAnimationEnd(Animator animation) {
                  mProgressView.setVisibility( show ? View.VISIBLE : View.GONE );
              }
          } );
      } else {
          // The ViewPropertyAnimator APIs are not available, so simply show
          // and hide the relevant UI components.
          mProgressView.setVisibility( show ? View.VISIBLE : View.GONE );
          mLoginFormView.setVisibility( show ? View.GONE : View.VISIBLE );
      }
  }
  
  @Override
  public Loader&lt;Cursor&gt; onCreateLoader(int i, Bundle bundle) {
      return new CursorLoader( this,
              // Retrieve data rows for the device user's 'profile' contact.
              Uri.withAppendedPath( ContactsContract.Profile.CONTENT_URI,
                      ContactsContract.Contacts.Data.CONTENT_DIRECTORY ), ProfileQuery.PROJECTION,
  
              // Select only email addresses.
              ContactsContract.Contacts.Data.MIMETYPE +
                      " = ?", new String[]{ContactsContract.CommonDataKinds.Email
              .CONTENT_ITEM_TYPE},
  
              // Show primary email addresses first. Note that there won't be
              // a primary email address if the user hasn't specified one.
              ContactsContract.Contacts.Data.IS_PRIMARY + " DESC" );
  }
  
  @Override
  public void onLoadFinished(Loader&lt;Cursor&gt; cursorLoader, Cursor cursor) {
      List&lt;String&gt; emails = new ArrayList&lt;&gt;();
      cursor.moveToFirst();
      while (!cursor.isAfterLast()) {
          emails.add( cursor.getString( ProfileQuery.ADDRESS ) );
          cursor.moveToNext();
      }
  
      addEmailsToAutoComplete( emails );
  }
  
  @Override
  public void onLoaderReset(Loader&lt;Cursor&gt; cursorLoader) {
  
  }
  
  private void addEmailsToAutoComplete(List&lt;String&gt; emailAddressCollection) {
      //Create adapter to tell the AutoCompleteTextView what to show in its dropdown list.
      ArrayAdapter&lt;String&gt; adapter =
              new ArrayAdapter&lt;&gt;( LoginActivity.this,
                      android.R.layout.simple_dropdown_item_1line, emailAddressCollection );
  
      mEmailView.setAdapter( adapter );
  }
  
  public void Register(View view) {
      Intent intent = new Intent(LoginActivity.this, BottomActivity.class);
      startActivity(intent);
      attemptLogin();
  
      mAuth.createUserWithEmailAndPassword(email.getText().toString(), password.getText().toString())
              .addOnCompleteListener( this, new OnCompleteListener&lt;AuthResult&gt;() {
          @Override
          public void onComplete(@NonNull Task&lt;AuthResult&gt; task) {
              if (task.isSuccessful()) {
                  Log.d( TAG, "createUserWithEmail:success" );
                  FirebaseUser user = mAuth.getCurrentUser();
                  updateUI( user );
              } else {
                  Log.w(TAG, "createUserWithEmail:failed");
                  Toast.makeText(LoginActivity.this, "Authentication failed", Toast.LENGTH_SHORT).show();
                  updateUI( null );
              }
          }
      } );
  }
  
  public void Login(View view) {
      Intent intent = new Intent(LoginActivity.this, LoginActivity2.class);
      startActivity(intent);
  }
  
  
  private interface ProfileQuery {
      String[] PROJECTION = {
              ContactsContract.CommonDataKinds.Email.ADDRESS,
              ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
      };
  
      int ADDRESS = 0;
  }
  
  /**
   * Represents an asynchronous login/registration task used to authenticate
   * the user.
   */
  @SuppressLint("StaticFieldLeak")
  public class UserLoginTask extends AsyncTask&lt;Void, Void, Boolean&gt; {
  
      private final String mEmail;
      private final String mPassword;
  
      UserLoginTask(String email, String password) {
          mEmail = email;
          mPassword = password;
      }
  
      @Override
      protected Boolean doInBackground(Void... params) {
          // TODO: attempt authentication against a network service.
  
          try {
              // Simulate network access.
              Thread.sleep( 2000 );
          } catch (InterruptedException e) {
              return false;
          }
  
          for (String credential : DUMMY_CREDENTIALS) {
              String[] pieces = credential.split( ":" );
              if (pieces[0].equals( mEmail )) {
                  // Account exists, return true if the password matches.
                  return pieces[1].equals( mPassword );
              }
          }
  
          // TODO: register the new account here.
          return true;
      }
  
      @Override
      protected void onPostExecute(final Boolean success) {
          mAuthTask = null;
          showProgress( false );
  
          if (success) {
              finish();
          } else {
              mPasswordView.setError( getString( R.string.error_incorrect_password ) );
              mPasswordView.requestFocus();
          }
      }
  
      @Override
      protected void onCancelled() {
          mAuthTask = null;
          showProgress( false );
      }
  
  }
  </code></pre>
  
  <p>}</p>