Проблема с диалогом выбора учетной записи для входа в Google Plus

#android #google-plus #firebase-authentication #google-signin

#Android #Google-plus #Firebase-аутентификация #google-вход

Вопрос:

ПРЕДЫСТОРИЯ

Я использую Google Plus OAuth в своем приложении вместе с Firebase. Когда пользователь нажимает кнопку входа, появляется диалоговое окно выбора учетной записи, и пользователь выбирает выбранную учетную запись и выполняет вход.

ПРОБЛЕМА

Предположим, что у пользователя есть две учетные записи на этом устройстве, A и B. Сначала он выбирает учетную запись A для входа, затем использует приложение, а затем решает выйти. Теперь он снова нажимает кнопку входа, но диалоговое окно выбора учетной записи не появляется, и он автоматически выполняет вход, используя ранее выбранную учетную запись A.

ЧЕГО Я ХОЧУ

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

код

Вот небольшой фрагмент кода о том, как я использую клиент Api Google для входа.

   String mClientId = parcel.getProviderExtra().getString(CLIENT_ID_KEY);
        GoogleSignInOptions googleSignInOptions;

        googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(mClientId)
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(activity)
                .addApi(Auth.GOOGLE_SIGN_IN_API, googleSignInOptions)
                .build();

        mGoogleApiClient.connect();
  

и выйдите из системы,

 Auth.GoogleSignInApi.signOut(mGoogleApiClient);
  

Любая помощь будет высоко оценена.

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

1. вы можете выйти из системы пользователя до mGoogleApiClient.connect(); с помощью app. conditions

2. API выхода из системы не помогает. Диалоговое окно не отображается при выходе пользователя из системы. Единственный способ — очистить данные, которые очищают некоторые сохраненные настройки, а затем диалоговое окно снова начинает появляться.

Ответ №1:

Проблема решена путем очистки учетной записи по умолчанию каждый раз перед входом в систему.

 @Override
    public void startLogin(Activity activity, String mEmail) {
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
        /**
         * Clearing default account every time so that the account picker dialog can be enforced
         */
        if (mGoogleApiClient != null amp;amp; mGoogleApiClient.isConnected()) {
            mGoogleApiClient.clearDefaultAccountAndReconnect();
        }
        activity.startActivityForResult(signInIntent, RC_SIGN_IN);
    }
  

Это приведет к появлению диалогового окна каждый раз.

Ответ №2:

     private void revokeAccess() {
        googleSignInClient.revokeAccess()
                .addOnCompleteListener(this, new OnCompleteListener<Void>() {
                    @Override
                    public void onComplete(@NonNull Task<Void> task) {
                        // ...
                        Log.d(LOGTAG, " /// revokeAccess() /// ");
                    }
                });
    }
  

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

1. Похоже, это не отвечает на вопрос

Ответ №3:

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

     private void signIn() {
    Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);

    if (mGoogleApiClient != null amp;amp; mGoogleApiClient.isConnected()) {

        mGoogleApiClient.clearDefaultAccountAndReconnect();
    }
    startActivityForResult(signInIntent, RC_SIGN_IN);
}
  

Ответ №4:

Начиная с Firebase 16 добавьте mGoogleSignInClient.revokeAccess();

 // Full Code
private void startGoogleSignIn() {
            GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                    .requestIdToken(getString(R.string.default_web_client_id))
                    .requestEmail()
                    .build();
            mGoogleSignInClient = GoogleSignIn.getClient(Splash.this, gso);
            mGoogleSignInClient.revokeAccess();
            Intent signInIntent = mGoogleSignInClient.getSignInIntent();
            startActivityForResult(signInIntent, RC_SIGN_IN);
        }