signInWithEmailAndPassword方法的行为不明确

时间:2018-07-25 13:01:21

标签: android firebase firebase-authentication

我有一个活动,即 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();
                        }
                    }
                });


            }
        }
    });
}

1 个答案:

答案 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 );
}