【问题标题】:Why FirebaseAuth.getCurrentUser() is returning null为什么 FirebaseAuth.getCurrentUser() 返回 null
【发布时间】:2020-04-27 14:17:04
【问题描述】:

我正在为 Android 重新编程/复制 whatsapp,但遇到了问题。

在我的应用中,用户必须自己注册才能使用它。注册后,用户将被定向到 MainActivity,他们可以在其中开始与朋友聊天或完成他们的个人资料。用户可以登录到应用程序,但前提是他们必须注销。注册后无需登录。

我在应用上使用 Firebase 技术、Firebase 身份验证、Firebas 数据库、Firebase 存储。当用户完成注册后,他的信息将存储在实时数据库中。

这是我注册自己的问题,我没有直接进入 MainActivity,而是被定向到 LoginActivity,只有在以下情况下才会发生这种情况 当前用户为空。如果 currentUser 为 null,则意味着 FirebasAuth.getCurrentUser() 返回 null。

我想了解为什么会这样?为什么我的 currentUser 变量在我几秒钟前注册时为空?为什么是FirebasAuth.getCurrentUser() 当我可以看到我的信息存储在 Firebase 数据库中时返回 null

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();
}

【问题讨论】:

    标签: android firebase-realtime-database firebase-authentication


    【解决方案1】:

    创建或登录用户后,FirebaseAuth.getInstance().getCurrentUser() 需要片刻时间才能接受此更改。因此,如果您同时使用该变量,您将获得null

    有两种解决方法:

    1. 使用创建用户后获得的Task&lt;AuthResult&gt; 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.
              }
          }
      };)
      

    【讨论】:

    • 我将我的 onStart 方法更改为此,但它仍然无法正常工作。 { 受保护的无效 onStart() { super.onStart(); mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { currentUser = firebaseAuth.getCurrentUser(); if (currentUser == null) SendUserToLoginActivity(); else verifyUserID(); } }) ; }
    • 抱歉这个评论我不知道如何在 cmets 中正确放置代码
    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2022-12-26
    • 2016-12-28
    • 2015-11-25
    • 2015-07-04
    • 2019-09-29
    • 2015-02-25
    • 2015-10-21
    相关资源
    最近更新 更多