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()
.
Ответы
Ответ 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();