# #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 ) );
}
Надеюсь, приведенный выше фрагмент кода поможет вам!