Подтвердить что ты не робот

Google Firebase выйдет и забудет пользователя в Android-приложении

Когда я вызываю mFirebaseAuth.signOut() или mFirebaseUser.delete() мой FirebaseAuth.AuthStateListener() работает правильно и возвращает значение null как экземпляр FirebaseUser в onAuthStateChanged, я onAuthStateChanged пользовательский интерфейс и показываю кнопку "Войти с помощью Google".

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

Мой вопрос, как показать это диалоговое окно после каждого выхода.

enter image description here

Я запускаю этот код, когда нажимаю кнопку "Войти":

// in onCreate()
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();

// in OnClickListener
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
            startActivityForResult(signInIntent, FirebaseActivity.REQUEST_SIGN_IN);

В onActivityResult() я получаю экземпляр GoogleSignInResult поэтому все, что мне нужно, происходит после вызова startActivityForResult().

4b9b3361

Ответ 1

В примере кода Firebase Auth Quickstart выход для поставщика Google включает в себя следующие шаги. Вы вызываете GoogleSignInClient.signOut() при выходе?

private void signOut() {
    // Firebase sign out
    mAuth.signOut();

    // Google sign out
    mGoogleSignInClient.signOut().addOnCompleteListener(this,
            new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    updateUI(null);
                }
            });
}

Ответ 2

Другой вариант - использовать библиотеку FirebaseUI. Он упрощает операции входа и выхода в том смысле, что он сделает всю тяжелую работу за вас.

Котлин

AuthUI.getInstance().signOut(this).addOnCompleteListener { 
    // do something here 
}

Джава

AuthUI.getInstance()
      .signOut(ActivityMainOld.this)
      .addOnCompleteListener(new OnCompleteListener<Void>(){

          @Override
          public void onComplete(@NonNull Task<Void> task) {

              // do something here

          }
      });

Надеюсь это поможет

Ответ 3

Для всех, кто хочет получить этот результат (как и при возврате опций учетной записи google) на другое действие.

public static void signOut() {
    // Firebase sign out
    mAuth.signOut();

    // Google sign out
    Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}

Добавьте это на страницу входа в систему, и перед тем, как перейти к следующему действию, просто позвоните SignOut().

// everything ok...             
signOut();
startActivity(new Intent(SignIn.this,NextOne.class));

а затем в другом классе вы можете вызвать

FirebaseAuth.getInstance().signOut();
startActivity(new Intent(NextClass.this, SignIn.class));

Это легко, и это сработает. Ура!

Ответ 4

Вы также можете определить что-то вроде этого:

private void signOut() {
    mAuth.signOut();
    mGoogleSignInClient.signOut().addOnCompleteListener(this,
            new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    Intent intent = new Intent(YourActivity.this, NextActivity.class);
                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                    startActivity(intent);
                }
            });
}

Ответ 5

private void sendToLogin() { //funtion
    GoogleSignInClient mGoogleSignInClient ;
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
        .requestIdToken(getString(R.string.default_web_client_id))
        .requestEmail()
        .build();
    mGoogleSignInClient = GoogleSignIn.getClient(getBaseContext(), gso);
    mGoogleSignInClient.signOut().addOnCompleteListener(/*CURRENT CLASS */.this,
        new OnCompleteListener<Void>() {  //signout Google
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                FirebaseAuth.getInstance().signOut(); //signout firebase
                Intent setupIntent = new Intent(getBaseContext(), /*To ur activity calss*/);
                Toast.makeText(getBaseContext(), "Logged Out", Toast.LENGTH_LONG).show(); //if u want to show some text
                setupIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(setupIntent);
                finish();
            }
        });
}

этот код написан, чтобы работать как копия прошлого, просто прочитайте КОММЕНТАРИИ в коде, чтобы настроить его на нужды ur, я предпочитаю отправлять пользователя для входа в систему

Ответ 6

Я сделал mGoogleSignInClient.signOut() это работает как ожидалось.

Ответ 7

Вы можете установить пользовательский параметр для GoogleAuthProvider, чтобы заставить пользователя проходить аутентификацию через Google.

var provider = new Firebase.auth.GoogleAuthProvider();
      provider.setCustomParameters({
        prompt: 'select_account'
      });

Ответ 8

Я был сбит с толку, так как все решения требовали ссылки на GoogleSignInClient, но на самом деле вам не нужно хранить ссылку на него, вы можете просто создать новый экземпляр и вызвать для него signOut().

GoogleSignIn.getClient(
    getContext(), 
    new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).build()
).signOut();