У меня есть активность, а именно EmailSignUpActivity, откуда я создаю пользователя, используя метод createUserWithEmailAndPassword из Firebase. После создания пользователя я перенаправляю его в Основная деятельность, где присутствует метод signOut. После выхода я перенаправляю пользователя в Войти, где присутствует опция входа по электронной почте и паролю, и подписываю пользователя с помощью метода signInWithEmailAndPassword.
Моя проблема в том, что после создания пользователя в первый раз я выхожу из системы и снова сразу же регистрирую пользователя в Войти, но ни один из моих тегов журнала, которые записаны внутри signInWithEmailAndPassword, не работают, и диалоговое окно прогресса не закрывается, что является записано внутри signInWithEmailAndPassword, что показывает, что этот метод не вызывается. Но когда я очищаю свое приложение из памяти телефона и снова открываю его, открывается Основная деятельность, который должен был открыться после успешного войти.
Более того, когда я очищаю приложение из памяти телефона после создания нового пользователя и выхода из него, а затем, если я пытаюсь войти в систему, все работает нормально.
Может ли кто-нибудь объяснить причину такого неоднозначного поведения?
В EmailSignUpActivityсоздание пользователя
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();
}
});
В Войтивход в систему
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();
}
}
});
}
}
});
}
В Основная деятельностьвыход пользователя
private void signOut() {
// getting the provider id
String providerId = null;
FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
for (UserInfo profile : user.getProviderData()) {
Log.d(TAG, "Provider: " + profile.getProviderId());
providerId = profile.getProviderId();
}
if (providerId.equals("password")){
Log.d(TAG, "signOut: inside password sign out");
// firebase sign out
firebaseAuth.signOut();
Log.d(TAG, "signOut: currentUser ==> "+firebaseAuth.getCurrentUser());
Intent intent = new Intent(MainActivity.this, LoginAndSignupActivity.class);
startActivity(intent);
finish();
}
}
Хорошо, попробуйте это, не инициализируйте поставщика, и когда вы хотите выйти, не получайте текущего пользователя, а вместо этого используйте this. ТОЛЬКО если вы используете пользовательский интерфейс firebase.
String providerId = profile.getProviderId();
FirebaseAuth.getInstance().signOut(this);
если вы используете Firebase Auth, возможно, попробуйте и Catch, чтобы увидеть, выходит ли ваша Firebase в первую очередь из системы, а не только переключает намерения. Я помню, что у меня была такая же проблема, и она касалась моего выхода из системы, может быть, примерно так:
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 );
}
Извините, что это возможно только не в вашем случае, проверьте отредактированный ответ и сообщите мне, поможет ли это.
signOut()не принимает никаких аргументов, поэтому передачаthisневозможна.