Почему FirebaseAuth.getCurrentUser () возвращает ноль - PullRequest
1 голос
/ 27 апреля 2020

Я перепрограммирую / воспроизводлю WhatsApp для android и столкнулся с проблемой.

В моем приложении пользователи должны зарегистрироваться, чтобы использовать его. После регистрации пользователи направляются в MainActivity, где они могут начать общаться со своими друзьями или заполнить свой профиль. Пользователи могут войти в приложение, но только если они выйдут из системы. Им не нужно входить в систему после регистрации.

Я использую технологии Firebase, Аутентификацию Firebase, базу данных Firebas, хранилище Firebase в приложении. Когда пользователь завершает свою регистрацию, его информация сохраняется в базе данных в реальном времени.

Вот проблема, которую я зарегистрировал сам, и вместо того, чтобы перейти непосредственно к MainActivity, я направлен в LoginActivity, и это может произойти только если currentUser равен нулю. Если currentUser имеет значение NULL, это означает, что FirebasAuth.getCurrentUser () возвращает значение NULL.

Я хочу понять, почему это происходит? Почему моя переменная currentUser равна нулю, когда я зарегистрировал себя только на несколько секунд go? Почему FirebasAuth.getCurrentUser() возвращает null, когда я вижу, что моя информация хранится в базе данных Firebase?

Вот код RegisterActivity:

public class RegisterActivity extends AppCompatActivity {
private Button createUser;
private EditText registerEmail, registerPassword;
private TextView haveAccount;


private FirebaseAuth mAuth;
private DatabaseReference RootRef;

private ProgressDialog loadingBar;

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

    mAuth=FirebaseAuth.getInstance();
    RootRef= FirebaseDatabase.getInstance().getReference();

    initializeFields();
    haveAccount.setClickable(true);
    haveAccount.setFocusable(true);

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

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





private void createNewAccount() {
    final String email=registerEmail.getText().toString();
    String password=registerPassword.getText().toString();

    if (TextUtils.isEmpty(email))
        Toast.makeText(this,"Please enter an address mail to create an account",Toast.LENGTH_LONG).show();

    if (TextUtils.isEmpty(password)) {
        Toast.makeText(this, "Please enter an address mail to create an account", Toast.LENGTH_LONG).show();
    } else {
        loadingBar.setTitle("Create new Account");
        loadingBar.setMessage("Please wait, while we creating account for you");
        loadingBar.setCanceledOnTouchOutside(true);
        loadingBar.show();

        mAuth=new FirebaseAuth(FirebaseApp.initializeApp(RegisterActivity.this));
        mAuth.createUserWithEmailAndPassword(email,password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task)
            {
                if (task.isSuccessful()) {
                    String currentUserID=mAuth.getCurrentUser().getUid();
                    RootRef.child("Users").child(currentUserID).setValue(email);

                    SendUserToMainActivity();
                    Toast.makeText(RegisterActivity.this, "Your account is created successfully", Toast.LENGTH_LONG).show();
                    loadingBar.dismiss();

                }
                else {

                    String message=task.getException().toString();
                    Toast.makeText(RegisterActivity.this,"Error " + message,Toast.LENGTH_LONG).show();
                    loadingBar.dismiss();
                }

            }
        });
    }
}

private void initializeFields() {
    createUser=findViewById(R.id.register_button);
    registerEmail=findViewById(R.id.register_email);
    registerPassword=findViewById(R.id.register_password);
    haveAccount=findViewById(R.id.already_have_account_link);

    loadingBar= new ProgressDialog(this);
}

private void SendUserToLoginActivity() {
    StartActivity(RegisterActivity.this,LoginActivity.class);
}

private void SendUserToMainActivity() {
    StartActivity(RegisterActivity.this,MainActivity.class);
}

private void StartActivity(Context c, Class<?> activity){
    Intent i=new Intent(c,activity);
    if(activity.equals(MainActivity.class)) {
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(i);
        finish();
    } else
        startActivity(i);
}

А вот код моей MainActivity

public class MainActivity extends AppCompatActivity {
private Toolbar mToolbar;
private ViewPager myViewPager;
private TabLayout myTabLayout;
private TabsAccessorAdapter myTabsAccessorAdapter;

private FirebaseUser currentUser;
private FirebaseAuth mAuth;
private DatabaseReference RootRef;

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

    mAuth = FirebaseAuth.getInstance();
    RootRef= FirebaseDatabase.getInstance().getReference();

    mToolbar=findViewById(R.id.main_page_toolbar);
    setSupportActionBar(mToolbar);
    getSupportActionBar().setTitle("WhatsApp");

    myViewPager=findViewById(R.id.main_tabs_pager);
    myTabsAccessorAdapter=new TabsAccessorAdapter(getSupportFragmentManager());
    myViewPager.setAdapter(myTabsAccessorAdapter);

    myTabLayout = findViewById(R.id.main_tabs);
    myTabLayout.setupWithViewPager(myViewPager);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.options_menu,menu);

    return true;
}

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId()==R.id.main_find_friends_option){

    }

    if (item.getItemId()==R.id.main_create_group_option){

        requestNewGroup();
    }

    if (item.getItemId()==R.id.main_settings_option){
        SendUserToSettingsActivity();
    }

    if (item.getItemId()==R.id.main_logout_option){
        mAuth.signOut();
        SendUserToLoginActivity();
    }

    return true;
}

@Override
protected void onStart() {
    super.onStart();

    currentUser = mAuth.getCurrentUser();

    if(currentUser==null)
        SendUserToLoginActivity();
    else
        verifyUserID();
}

private void SendUserToLoginActivity() {
    StartActivity(MainActivity.this,LoginActivity.class);
}

private void StartActivity(Context c, Class<?> activity){
    Intent i=new Intent(c,activity);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    startActivity(i);
    finish();
}

1 Ответ

0 голосов
/ 27 апреля 2020

После создания или входа в систему пользователю требуется некоторое время, прежде чем FirebaseAuth.getInstance().getCurrentUser() обнаружит это изменение. Таким образом, если вы используете эту переменную в то же время, вы получите null.

. Есть два варианта решения этой проблемы:

  1. Использование Task<AuthResult> task что вы получаете после создания пользователя. Так что String currentUserID=task.getResult().getUser().getUid(); и передайте это новому действию в намерении.

  2. Используйте AuthStateListener, чтобы выбрать состояние аутентификации в следующем действии.

    FirebaseAuth.getInstance().addAuthStateListener(new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser user = firebaseAuth.getCurrentUser();
            if (user != null) {
                // Sign in logic here.
            }
        }
    };)
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...