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