#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);
}