Как устранить исключение Nullpointer после повторного входа пользователя в приложение Firebase? - PullRequest
0 голосов
/ 09 октября 2019

Когда проверенный по электронной почте пользователь впервые входит в мое приложение, все работает как положено (он попадает на экран приветствия, а затем в 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

1 Ответ

1 голос
/ 09 октября 2019

Проблема в том, что вы звоните

final FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata()  

Вызов его до завершения входа в систему пользователя приводит вас к NullPointer, с которой вы сталкиваетесь. Просто переместите его в обратный вызов onComplete, где значение current user имеет значение.

Кроме того, просто для оптимизации кода добавьте оператор возврата при переключении на MainActivity.

if (firebaseUser != null && firebaseUser.isEmailVerified()) {
     startActivity(new Intent(LoginEmailActivity.this, MainActivity.class));
     finish();
     return;
}

Вам нужно возвращать в своем операторе if, когда вы идете в MainActivity. В противном случае после этого вы устанавливаете снова setContentView(R.layout.activity_email_login).

...