我有一个活动,即 EmailSignUpActivity ,它是我利用Firebase的createUserWithEmailAndPassword
方法在其中创建用户的。创建用户后,我将其重定向到存在signOut
方法的 MainActivity 。退出后,我将用户重定向到存在电子邮件和密码登录选项的 LoginActivity ,并使用signInWithEmailAndPassword
方法登录用户。
我的问题是,第一次创建用户后,我要注销该用户,然后再次立即在 LoginActivity 中登录该用户,但是我的日志标签都没有写在{{ 1}}正常工作,进度对话框也未关闭,该对话框写在signInWithEmailAndPassword
内,这表明未调用此方法。但是,当我从手机的内存中清除我的应用程序并再次打开它时,就会打开 MainActivity ,该应用程序应该在成功登录 后才能打开。
此外,当我在创建新用户并将其注销后从手机的内存中清除该应用程序后,如果我尝试登录该用户,则一切运行正常。
有人能解释这种模棱两可行为的原因吗?
在 EmailSignUpActivity 中创建用户
signInWithEmailAndPassword
在 LoginActivity 中登录用户
mAuth.createUserWithEmailAndPassword(email, password).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
progressDialog.dismiss();
Log.d(TAG, "onSuccess: new user created");
Toast.makeText(EmailSignUpActivity.this, "User created", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
progressDialog.dismiss();
Log.w(TAG, "onFailure: user creation failed ", e);
Toast.makeText(EmailSignUpActivity.this, "User already exist", Toast.LENGTH_SHORT).show();
}
});
在 MainActivity 中退出用户
private void emailAndPasswordLogin() {
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick:");
progressDialog.show();
String email = emailEditText.getText().toString();
String password = passwordEditText.getText().toString();
if(!email.equals("null") && !password.equals("null")) {
Log.d(TAG, "onClick: mAuth ==> "+mAuth);
mAuth.signInWithEmailAndPassword(email, password).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "onComplete:");
if(task.isSuccessful()){
Log.d(TAG, "onComplete: if task successful");
progressDialog.dismiss();
Log.d(TAG, "onSuccess: login success ");
Boolean newUser = task.getResult().getAdditionalUserInfo().isNewUser();
Log.d(TAG, "LoginButton == onSuccess: newUser ==> "+newUser);
if(newUser){
//
boolean hasImage = false;
enteringDataIntoUserNode(hasImage);
//
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}else{
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
}
}else{
progressDialog.dismiss();
Log.w(TAG, "onFailure: login failure ", task.getException());
Toast.makeText(LoginActivity.this, "Email or Password invalid.", Toast.LENGTH_SHORT).show();
}
}
});
}
}
});
}
答案 0 :(得分:0)
好的,尝试不要初始化提供程序,而要注销时不要获取当前用户,而是使用this
。仅当您使用Firebase UI时。
String providerId = profile.getProviderId()
;
FirebaseAuth.getInstance().signOut(this)
;
如果您正在使用Firebase Auth,则可以尝试并Catch来查看您的Firebase是否首先注销,而不仅仅是切换Intent。我记得我遇到了同样的问题,这与我的注销过程有关,也许是这样的:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
try {
mAuth.signOut();
Toast.makeText(this, "User Sign out!", Toast.LENGTH_SHORT).show();
}catch (Exception e) {
Log.e(TAG, "onClick: Exception "+e.getMessage(),e );
}