Почему мое приложение закрывается, когда пользователь выходит из учетной записи?

# #android #firebase #firebase-realtime-database

Вопрос:

Когда пользователь выходит из системы, приложение закрывается.

Проблема возникла, когда я изменил правила реального времени с этого

 {
  "rules": {
    ".read": true,
    ".write": true
  }
}
 

к этому

 {
  "rules": {
    ".read": "auth.uid != null",
    ".write": "auth.uid != null"
    }
}

 

КНОПКА ВЫХОДА ИЗ СИСТЕМЫ

         button5.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth.getInstance().signOut();
                Intent intent = new Intent(getActivity(), MainActivity.class);
                startActivity(intent);
                getActivity().finishAffinity();
            }
        });
 

Ответ №1:

Похоже, ваше приложение выходит из строя, и в этом случае в вывод logcat будет записано сообщение об ошибке и трассировка стека. Это подскажет вам, в чем проблема и где она возникает в вашем коде.

Тем не менее, учитывая, что это произошло, когда вы изменили систему безопасности, у вас, скорее всего, будет активный прослушиватель вашей базы данных, когда вы выйдете из системы. Поскольку у вас установлены правила ".read": "auth.uid != null" , это означает, что пользователь должен пройти проверку подлинности, чтобы иметь возможность считывать/прослушивать данные. Поэтому, когда они выходят из системы, это условие больше не выполняется.

Я предполагаю, что у вас есть onCancelled слушатель, который реализован как:

 @Override
public void onCancelled(DatabaseError databaseError) {
    throw databaseError.toException();
}
 

Таким образом, это исключение в этом случае является причиной сбоя вашего приложения.

Ваши два основных варианта устранения этой ошибки:

  1. Найдите активных слушателей и [удалите их] перед выходом пользователя из системы. Это чистое решение, но это определенно больше работы, чем…
  2. Не создавайте исключение, но регистрируйте проблему с помощью:
     @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.e("Firebase", "Database listener cancelled", databaseError.toException());
    }