当前位置: 首页 > 知识库问答 >
问题:

如何在新的Google Drive Android API下切换帐户

阮疏珂
2023-03-14

我在新的Google Drive Android API中的授权流程如下:

  1. 菜单:选择帐户

很有魅力。现在重复一下,目的是切换帐户:

  1. 菜单:选择帐户
  2. connect()
  3. onConnected()

在这里,我没有机会访问AccountSelectDialog,因为我从未使用“result”获取onConnectionFailed()来调用startResolutionForResult()。这次我错过了什么?

共有3个答案

越嘉石
2023-03-14

我意识到我打开了两个关于基本相同主题的SO问题,弄得一团糟。所以,现在是巩固答案的好时机。我在GDAA中搜索直接getter/setter方法,但只找到了'setter'-setAccount tName())-SO问题21583828(实际上没有,但Burcu帮助了我)。

另一方面,“getter”可以通过从“onActivityResult()”中获取帐户名来替代-所以问题21501829

关于同一主题的另一个问题也得到了解决。

因此,结论是:

  1. 从'onActivityResult()'获取帐户
  2. 在'setAccount tName()'中设置帐户
  3. 保留您的当前帐户电子邮件,以便您可以检测到新的电子邮件(如果用户决定切换)并在必要时重置Google帐户客户端。

更新2014-11-04:

这是一个包装器,我用它来保存和管理我应用程序中的Google帐户。

import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.google.android.gms.auth.GoogleAuthUtil;

public class GooAccMgr {
  private static final String ACC_NAME = "account_name";
  public  static final int FAIL = -1;
  public  static final int UNCHANGED =  0;
  public  static final int CHANGED = +1;

  private String mCurrEmail = null;  // cache locally

  public Account[] getAllAccnts(Context ctx) {
    return AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
  }

  public Account getPrimaryAccnt(Context ctx) {
    Account[] accts = getAllAccnts(ctx);
    return accts == null || accts.length == 0 ? null : accts[0];
  }

  public Account getActiveAccnt(Context ctx) {
    return email2Accnt(ctx, getActiveEmail(ctx));
  }

  public String getActiveEmail(Context ctx) {
    if (mCurrEmail != null) {
      return mCurrEmail;
    }
    mCurrEmail = ctx == null ? null : pfs(ctx).getString(ACC_NAME, null);
    return mCurrEmail;
  }

  public Account email2Accnt(Context ctx, String emil) {
    if (emil != null) {
      Account[] accounts =
       AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
      for (Account account : accounts) {
        if (emil.equalsIgnoreCase(account.name)) {
          return account;
        }
      }
    }
    return null;
  }

  /**
   * Stores a new email in persistent app storage, reporting result
   * @param ctx activity context
   * @param newEmail new email, optionally null
   * @return FAIL, CHANGED or UNCHANGED (based on the following table)
   * OLD    NEW   SAVED   RESULT
   * ERROR                FAIL
   * null   null  null    FAIL
   * null   new   new     CHANGED
   * old    null  old     UNCHANGED
   * old != new   new     CHANGED
   * old == new   new     UNCHANGED
   */
  public int setEmail(Context ctx, String newEmail) {
    int result = FAIL;  // 0  0

    String prevEmail = getActiveEmail(ctx);
    if        ((prevEmail == null) && (newEmail != null)) {
      result = CHANGED;
    } else if ((prevEmail != null) && (newEmail == null)) {
      result = UNCHANGED;
    } else if ((prevEmail != null) && (newEmail != null)) {
      result = prevEmail.equalsIgnoreCase(newEmail) ? UNCHANGED : CHANGED;
    }
    if (result == CHANGED) {
      mCurrEmail = newEmail;
      pfs(ctx).edit().putString(ACC_NAME, newEmail).apply();
    }
    return result;
  }

  private Context acx(Context ctx) {
    return ctx == null ? null : ctx.getApplicationContext();
  }
  private SharedPreferences pfs(Context ctx) {
    return ctx == null ? null : PreferenceManager.getDefaultSharedPreferences(acx(ctx));
  }
}

Alex Lockwood的帽子提示,以获得初步灵感。不幸的是,我找不到他原始代码的引用。

裴浩歌
2023-03-14

打个电话就行了

mGoogleApiClient.clearDefaultAccount tAnd重新连接();

看看这些文件

这将调用onConnectionFailed回调,该回调将显示布局,以便在可用的Google帐户中进行选择:

@Override
public void onConnectionFailed(ConnectionResult connectionResult) 
{
    if (connectionResult.hasResolution()) {
        try {                                              
            connectionResult.startResolutionForResult(this, RESOLVE_CONNECTION_REQUEST_CODE);
        } catch (IntentSender.SendIntentException e) {
            // Unable to resolve, message user appropriately
        }
    } else {                                           
        GooglePlayServicesUtil.getErrorDialog(connectionResult.getErrorCode(), this, 0).show();
    }

}
端木野
2023-03-14

首先,添加Plus。API:

mGoogleApiClient = new GoogleApiClient.Builder(this).addApi(Drive.API).addApi(Plus.API).addScope(Drive.SCOPE_APPFOLDER).addConnectionCallbacks(this).addOnConnectionFailedListener(this).build();

然后您可以像这样切换帐户:

public void onClick(View view) {
  if (view.getId() == R.id.sign_out_button) {
    if (mGoogleApiClient.isConnected()) {
      Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
      mGoogleApiClient.disconnect();
      mGoogleApiClient.connect();
    }
  }
}

有关更多信息,请参阅此处。

 类似资料:
  • 使用AWS CLI时,它会引用位于~/.AWS目录中的凭据和配置文件。您可以使用--profile标志来指示需要哪个帐户。例如: 等 但是我对python 3和boto 3的脚本是新手,我想在那里做同样的事情。如何使用python在AWS帐户之间切换?

  • 我已通过VS代码使用Azure帐户扩展登录到我的一个Azure帐户。我没有找到任何注销或切换帐户的按钮。如何注销或切换帐户?

  • 我正在使用Python进行selenium自动化项目。 我面临一个问题,这是处理多个浏览器窗口。 场景如下所示。当我单击主页上的链接时,将打开一个新窗口。在新打开的窗口中,我无法执行任何操作,因为焦点仍然在主页web驱动程序上。 谁能告诉我如何将焦点从背景窗口转换到新打开的窗口? 一种可能的解决方案是,但它需要窗口的名称。如何找出窗口的名字?如果这是一个错误的方法,谁能给出一些代码例子来执行这个操

  • 我试图在CSS/HTML和JavaScript中重新创建这种切换。当关闭时,切换显示标题:“Stap 2 Implementatie in de Organizatie”和一个图标(圆圈中有加号)。当打开时,它会显示一些文本,下面是一个带有可下载工具的部分,它们可以被实现为相邻的图像,但如果图标和文本分开,它可能更多用途。 我已经设法创建了标题,它下面的文本,我只是需要帮助: 关闭切换和打开切换的

  • 问题内容: 我有2个Google App Engine帐户。一种是个人帐户。另一个是工作帐户。 将应用程序部署到Google App Engine。第一次,我使用“ goapp deploy”,它要求我提供电子邮件和密码。现在我被卡住了。我无法切换到其他帐户。 我试图重新启动Mac,但无法正常工作。我应该怎么做才能使用另一个帐户进行部署? 问题答案: 您是否尝试过在命令行中使用 --email 选

  • 问题内容: 在和之间切换的最有效方法是什么? 问题答案: 使用NOT的解决方案 如果值是布尔值,最快的方法是使用 not 运算符: 用减法求解 如果值是数字,则从总数中减去是切换值的一种简单快捷的方法: 使用XOR的解决方案 如果值在 0 和 1 之间切换,则可以使用按位异或: 该技术可以推广到任意一对整数。异或一步被替换为预异常数: (此想法由Nick Coghlan提交,后来由@zxxc推广。