Как выйти из системы пользователя, когда он этого хочет, в Android studio

# #java #android #firebase #firebase-realtime-database

Вопрос:

Поэтому в своем коде я создал страницу входа, на которой он видит, к какому узлу подключен пользователь(драйвер или клиент), и переносит их соответственно на эту страницу, а также сохраняет вход пользователя даже после того, как пользователь закрывает приложение, но всякий раз, когда я пытаюсь выйти со страницы, приложение аварийно завершает работу, это моя страница входа

 public class Login_Page extends AppCompatActivity {
    ActivityLoginPageBinding binding;
    ProgressDialog progressdialog;
    FirebaseAuth auth;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityLoginPageBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        button = findViewById(R.id.Googlelogin);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Login_Page.this, SignUp.class);
                startActivity(intent);
            }
        });
        progressdialog = new ProgressDialog(Login_Page.this);
        progressdialog.setTitle("Logging in");
        progressdialog.setMessage("Please wait");
        auth = FirebaseAuth.getInstance();
        if (auth.getCurrentUser() != null) {
            String uid = auth.getInstance().getCurrentUser().getUid();
            DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
            DatabaseReference uidRef = rootRef.child("Users").child("Driver").child(uid);
            ValueEventListener valueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    if (snapshot.exists()) {
                        Toast.makeText(Login_Page.this, "LoginDriver", Toast.LENGTH_SHORT);
                        Intent intent = new Intent(Login_Page.this, HomePage.class);
                        startActivity(intent);
                    } else {
                        startActivity(new Intent(Login_Page.this, Custhomepage.class));
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            };
            uidRef.addListenerForSingleValueEvent(valueEventListener);
        } else {
            binding.Login.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    progressdialog.show();
                    auth.signInWithEmailAndPassword(binding.Email.getText().toString(), binding.Password.getText().toString())
                            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                                @Override
                                public void onComplete(@NonNull Task<AuthResult> task) {
                                    progressdialog.dismiss();
                                    if (task.isSuccessful()) {
                                        Toast.makeText(Login_Page.this, "Success", Toast.LENGTH_SHORT).show();
                                        String uid = auth.getInstance().getCurrentUser().getUid();
                                        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                                        DatabaseReference uidRef = rootRef.child("Users").child("Driver").child(uid);
                                        ValueEventListener valueEventListener = new ValueEventListener() {
                                            @Override
                                            public void onDataChange(@NonNull DataSnapshot snapshot) {
                                                if (snapshot.exists()) {
                                                    Toast.makeText(Login_Page.this, "LoginDriver", Toast.LENGTH_SHORT);
                                                    Intent intent = new Intent(Login_Page.this, HomePage.class);
                                                    startActivity(intent);
                                                } else {
                                                    startActivity(new Intent(Login_Page.this, Custhomepage.class));
                                                }
                                            }

                                            @Override
                                            public void onCancelled(@NonNull DatabaseError error) {

                                            }
                                        };
                                        uidRef.addListenerForSingleValueEvent(valueEventListener);
                                    } else {
                                        Toast.makeText(Login_Page.this, task.getException().getMessage(), Toast.LENGTH_SHORT);
                                    }
                                }
                            });

                }
            });


        }
    }
}
 

и это часть домашней страницы как клиента, так и водителя, с которой пользователь может выйти из системы

 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater=getMenuInflater();
        inflater.inflate(R.menu.menu,menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()){
            case R.id.setting:
                break;

            case R.id.logout:
                auth.signOut();
                Intent intent=new Intent(HomePage.this,Login_Page.class);
                startActivity(intent);
                break;
        }
        return super.onOptionsItemSelected(item);
    }
 

Правки:
когда приложение выходит из строя, я получаю это в своем журнале.

 2021-06-22 11:22:59.829 10882-10882/com.example.deliveryapp E/InputEventReceiver: Exception dispatching input event.
2021-06-22 11:22:59.829 10882-10882/com.example.deliveryapp E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-06-22 11:22:59.834 10882-10882/com.example.deliveryapp E/MessageQueue-JNI: java.lang.NullPointerException: Attempt to invoke virtual method 'void com.google.firebase.auth.FirebaseAuth.signOut()' on a null object reference
 

Также у меня не было этой проблемы, когда у меня была только 1 домашняя страница
, но когда я добавил код, позволяющий пользователю входить в систему там, где он должен находиться (в основном, когда я добавил еще 1 домашнюю страницу), у меня начались проблемы при выходе из системы

Комментарии:

1. » или приложение выходит из строя » — Что отображается в журнале регистрации, когда оно выходит из строя?

2. Я отредактировал свой вопрос с дополнительной информацией @Dioxin

3. Где находится ваша база данных? Пожалуйста, ответьте @AlexMamo

4. моя база данных находится в firbase @AlexMamo

5. В каком месте, в Европе, США и т.д.?

Ответ №1:

Похоже, вы не инициализировали auth объект перед вызовом auth.signout() . Это может быть причиной исключения. Вызовите приведенный ниже logout() метод в своем case R.id.logout:

 private void logout () {
    FirebaseAuth mAuth = FirebaseAuth.getInstance ();
    mAuth.signOut ();
    finish ();
    startActivity ( new Intent ( this, Login_Page.class ) );
}
 

Надеюсь, приведенный выше фрагмент кода поможет вам!