每次调用connect时,如何强制GoogleApiClient提示帐户选择器UI?

Che*_*eng 10 android google-play-services google-drive-android-api

每当我在第一个应用程序启动周期中第一次运行代码

GoogleApiClient mGoogleApiClient = new GoogleApiClient.Builder(context)
    .addApi(Drive.API)
    .addScope(Drive.SCOPE_APPFOLDER) // required for App Folder sample
    .addConnectionCallbacks(this)
    .addOnConnectionFailedListener(this)
    .build();

mGoogleApiClient.connect();
Run Code Online (Sandbox Code Playgroud)

我可以看到以下帐户选择器.

在此输入图像描述

但是,如果之前的连接成功,并且我在第二个应用程序启动周期中第一次再次运行相同的代码.

帐户选择器不会再次弹出.GoogleApiClient将使用帐户名称,我在之前的应用程序启动周期中选择.

我希望每次都能弹出我的帐号选择器.

我遇到了如何清除GoogleApiClient默认帐户和凭据

建议的解决方案不适合我的情况.

mGoogleApiClient.clearDefaultAccountAndReconnect()
Run Code Online (Sandbox Code Playgroud)

如果我已连接上一个应用程序周期,并且我在当前应用程序周期中第一次调用上面的代码,我将得到以下异常.

java.lang.IllegalStateException: GoogleApiClient is not connected yet.
    at com.google.android.gms.common.internal.zzx.zza(Unknown Source)
    at com.google.android.gms.common.api.internal.zzj.clearDefaultAccountAndReconnect(Unknown Source)
Run Code Online (Sandbox Code Playgroud)

以下代码也不起作用.

if (mGoogleApiClient.isConnected()) {
    // No chance to execute this code, if you run this code during app launch.
    mGoogleApiClient.clearDefaultAccountAndReconnect();
} else {
    // No account chooser will pop up if you had been connected in previous app life cycle
    mGoogleApiClient.connect();
}
Run Code Online (Sandbox Code Playgroud)

我可以知道,每次调用connect时,如何强制GoogleApiClient提示帐户选择器UI?

sea*_*npj 12

GDAAREST Api中,您有两种选择:
1 /您没有指定帐户,底层系统将管理它.
2 /您自己管理帐户.

如果您使用第一种方法,则永远不会知道您的应用用户是谁.您只能通过以下方式"清理"帐户clearDefaultAccountAndReconnect.选择对话框再次弹出,用户可以选择(添加)另一个帐户.

如果您需要知道当前选定的用户帐户(即缓存/持久性),您必须自己管理帐户选择,如此处(对于REST)此处(对于GDAA) - 只需按照 REQ_ACCPICK跟踪和UT.AM类.这样你就可以完全掌控了.

所以,你的问题的简短回答是你弹出

startActivityForResult(AccountPicker.newChooseAccountIntent(null,
        null, new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE}, true, null, null, null, null),
        REQ_ACCPICK);
Run Code Online (Sandbox Code Playgroud)

自己活动并交付结果

email = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)
Run Code Online (Sandbox Code Playgroud)

setAccountName(email)的:

   GAC = new GoogleApiClient.Builder(act)
      .addApi(Drive.API)
      .addScope(Drive.SCOPE_FILE)
      .addScope(Drive.SCOPE_APPFOLDER)
      .addConnectionCallbacks(...)
      .addOnConnectionFailedListener(...)
      ....
      .setAccountName(email)
      ....
      .build();
Run Code Online (Sandbox Code Playgroud)

祝好运

  • 另一点:AccountPicker.newChooseAccountIntent()创建的选择器对话框与GooglePlayServices中内置的完全不同.它变得更糟:它没有正确的主题,浅色主题的黑暗背景,黑色背景上的小部件是黑色的.看起来像谷歌那些家伙甚至不打扰最琐碎的测试. (3认同)
  • 我没有意识到我们可以直接setAccountName.谢谢. (2认同)

Kam*_*ili 5

我想我迟到了,但这就是我解决它的方式。

在我开始 Google SignIn Intent 之前,它将显示构建器。 Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient); startActivityForResult(signInIntent, RC_SIGN_IN);

做这个:

if (mGoogleApiClient.hasConnectedApi(Auth.GOOGLE_SIGN_IN_API)) { mGoogleApiClient.clearDefaultAccountAndReconnect(); }

由于mGoogleApiClient出于某种原因存储了登录的用户。因此,如果您这样做mGoogleApiClient.isConnected(),即使您正在重新创建mGoogleApiClient. 但是,这将强制它清除已选择的用户。

经测试,它有效。