Когда проверенный по электронной почте пользователь впервые входит в мое приложение, все работает как положено (он попадает на экран приветствия, а затем в MainActivity), но когда он выходит из системы и снова входит в систему, возникает исключение нулевого указателя,Когда пользователь регистрируется во второй раз, он должен перейти прямо к MainActivity, а не к экрану приветствия, который вы видите в приведенном ниже коде.
Это была известная проблема около года назад, поэтому мой вопрос, как решить эту проблему? Исправлена ли эта ошибка, и когда да, что я сделал неправильно в своем коде?
Вопрос, который я имею в виду, здесь: Пользователь Firebase возвращает нулевые метаданные для уже зарегистрированных пользователей
Вот код, который я использую, чтобы проверить, входит ли пользователь в первый или второй раз:
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
auth = FirebaseAuth.getInstance();
FirebaseUser firebaseUser = auth.getCurrentUser();
if (firebaseUser != null && firebaseUser.isEmailVerified()) {
startActivity(new Intent(LoginEmailActivity.this, MainActivity.class));
finish();
}
setContentView(R.layout.activity_email_login);
...
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
...
progressBar.setVisibility(View.VISIBLE);
final FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
//authenticate user
auth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(LoginEmailActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressBar.setVisibility(View.GONE);
if (!task.isSuccessful()) {
Toast.makeText(LoginEmailActivity.this, "Ups, es ist wohl etwas schief gelaufen. Bitte überprüfe deine Internetverbindung und versuche es erneut.", Toast.LENGTH_LONG).show();
} else {
if (auth.getCurrentUser().isEmailVerified() && !(metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp())){
Intent intent = new Intent(LoginEmailActivity.this, MainActivity.class);
startActivity(intent);
finish();
} else if (auth.getCurrentUser().isEmailVerified() && (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp())){
firstLoginScreen();
finish();
}
else if (!auth.getCurrentUser().isEmailVerified()){
Toast.makeText(LoginEmailActivity.this, "Bitte verifiziere erst deine E-Mail Adresse mit dem Link, den wir dir geschickt haben.", Toast.LENGTH_SHORT).show();
}
}
}
});
}
});
...
Вот ошибка:
java.lang.NullPointerException: попытка вызвать виртуальный метод 'com.google.firebase.auth.FirebaseUserMetadata com.google.firebase.auth.FirebaseUser.getMetadata ()' для ссылки на пустой объект по адресу com.example.android.guessit.LoginRegistration.Login $.onClick
Также «getCreationTimestamp» говорит, что может выдать исключение NullPointerException