Google Plus 登录帐户选择对话框问题

Posted

技术标签:

【中文标题】Google Plus 登录帐户选择对话框问题【英文标题】:Google Plus Sign In Account Selection Dialog Issue 【发布时间】:2017-02-09 18:27:08 【问题描述】:

背景

我在我的应用中使用 Google Plus OAuth 和 Firebase。当用户点击登录按钮时,会出现帐户选择对话框,用户选择选择的特定帐户并登录。

问题

假设用户在该设备上有两个帐户,A 和 B。最初,他选择帐户 A 登录,然后使用该应用程序,然后决定退出。现在他再次点击登录按钮,但帐户选择对话框没有出现,它使用之前选择的帐户 A 自动登录。

我想要什么

我希望用户每次都能看到帐户选择对话框,如果他们愿意,让他们有机会选择不同的帐户

代码

这是我如何使用 Google Api 客户端登录的小代码 sn-p。

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

我们将不胜感激。

【问题讨论】:

可以在 mGoogleApiClient.connect() 之前注销用户;与应用程序。条件 退出 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 && 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() /// ");
                    
                );
    

【讨论】:

这似乎没有回答问题【参考方案3】:

只需在用户每次登录时清除默认帐户,使用以下方法即可。

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

    if (mGoogleApiClient != null && 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);
        

【讨论】:

以上是关于Google Plus 登录帐户选择对话框问题的主要内容,如果未能解决你的问题,请参考以下文章

使 Google 登录对话框不可取消

使用Firebase Google用户身份验证更改用户

每次用户登录时,Google 登录都使用相同的帐户

Firebase Google 身份验证,退出并再次登录将使用上次登录的帐户登录

仅当在流程中添加帐户时,Google 登录才会将显示名称返回为 null

idpiframe_initialization_failed 在 Google 从 Localhost 登录