Google Plus 登录帐户选择对话框问题
Google Plus Sign In Account Selection Dialog Issue
背景
我在我的应用程序中使用 Google Plus OAuth 以及 Firebase。当用户点击登录按钮时,会出现帐户 selection 对话框,用户 select 选择特定的帐户并登录。
问题
假设用户在该设备上有两个帐户,A 和 B。最初,他 select 的帐户 A 登录,然后使用该应用程序,然后决定退出。现在他再次点击登录按钮,但是 帐户 selection 对话框没有出现 并且它自动使用之前 selected 的帐户 A 登录。
我想要什么
我希望每次都向用户显示帐户 selection 对话框,并且 给他们机会 select 一个不同的帐户 如果他们想要。
代码
这是我如何使用 Google Api 客户端登录的一小段代码。
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);
非常感谢任何帮助。
通过每次登录前清除默认帐户解决此问题。
@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 && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect();
}
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
}
这将强制对话框每次都出现。
只需在用户每次登录时清除默认帐户,方法如下。
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect();
}
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void revokeAccess() {
googleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// ...
Log.d(LOGTAG, " /// revokeAccess() /// ");
}
});
}
从 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);
}
背景
我在我的应用程序中使用 Google Plus OAuth 以及 Firebase。当用户点击登录按钮时,会出现帐户 selection 对话框,用户 select 选择特定的帐户并登录。
问题
假设用户在该设备上有两个帐户,A 和 B。最初,他 select 的帐户 A 登录,然后使用该应用程序,然后决定退出。现在他再次点击登录按钮,但是 帐户 selection 对话框没有出现 并且它自动使用之前 selected 的帐户 A 登录。
我想要什么
我希望每次都向用户显示帐户 selection 对话框,并且 给他们机会 select 一个不同的帐户 如果他们想要。
代码
这是我如何使用 Google Api 客户端登录的一小段代码。
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);
非常感谢任何帮助。
通过每次登录前清除默认帐户解决此问题。
@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 && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect();
}
activity.startActivityForResult(signInIntent, RC_SIGN_IN);
}
这将强制对话框每次都出现。
只需在用户每次登录时清除默认帐户,方法如下。
private void signIn() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
if (mGoogleApiClient != null && mGoogleApiClient.isConnected()) {
mGoogleApiClient.clearDefaultAccountAndReconnect();
}
startActivityForResult(signInIntent, RC_SIGN_IN);
}
private void revokeAccess() {
googleSignInClient.revokeAccess()
.addOnCompleteListener(this, new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
// ...
Log.d(LOGTAG, " /// revokeAccess() /// ");
}
});
}
从 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);
}