【问题标题】:Retrieve account name with the NEW Google Drive API使用新的 Google Drive API 检索帐户名称
【发布时间】:2014-02-25 10:22:16
【问题描述】:

我按照https://developers.google.com/drive/android/auth 中的描述设置了 Google Play 服务的授权流程

现在用户已授权我要检索帐户名称的应用程序。但我在 API (http://developer.android.com/reference/gms-packages.html) 中找不到任何有用的方法。

【问题讨论】:

    标签: android google-drive-api google-play-services


    【解决方案1】:

    我假设您已经拥有QUICKSTARTDEMO,或类似的正在运行的东西,所以我将参考这两个示例。在BaseDemoActivity.java 代码中,您会注意到连接失败时会调用帐户选择,

    @Override public void onConnectionFailed(ConnectionResult result) {
      ...
      result.startResolutionForResult(this, REQUEST_CODE_RESOLUTION);
      ...
    }
    

    ... 它在 onActivityResult() 中返回。我只是抓取意图数据并获取 KEY_ACCOUNT_NAME,它是选定的电子邮件。下面的代码是从DEMO的BaseDemoActivity.java(我上面提到的)修改而来的。

    @Override protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
      switch (requestCode) {
        case REQUEST_CODE_RESOLUTION:
        if ((resultCode == RESULT_OK) && (data != null) && (data.getExtras() != null ))
          // user selected account, get it
          String email = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
        else
          finish();    // user cancelled selection, an easy solution
        break;
      }
    

    【讨论】:

    • @lebenlechzer 另一个问题,#21610239 也处理这个问题。如果你一直跟着它到 Github,有一些我用来处理(可能不相关)问题的代码。
    • 嗨,我也在做同样的事情,但我得到的数据为空有什么想法
    • 不知道。尽管如此,我还是会去检查你设备上 GooPlaySvcs 的状态。版本不匹配?清除缓存? Zap GooPlaySvcs 数据(对其他应用程序很危险;我有一个可以搞砸的专用开发设备)。
    • 同样的问题,选择器很好,并且选择了一个帐户(我什至成功地将数据存储在那里)但是此回调的 Intent 数据为空。如果我改用“AccountPicker.newChooseAccountIntent”,我会得到帐户名...
    • 这个问题有什么解决办法吗?它对我来说也是空的。
    【解决方案2】:
    1. 检查用户是否签名

      GoogleSignInClient mGoogleSignInClient;
          private void setupAuthorization() {
              GoogleSignInOptions signInOptions =
                      new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                              .requestEmail() // add it if you want to user email 
                              .requestScopes(Drive.SCOPE_FILE)
                              .build();
              mGoogleSignInClient = GoogleSignIn.getClient(this, signInOptions);
              mGoogleSignInClient.silentSignIn().addOnSuccessListener(googleSignInAccount -> {googleSignInAccount.getEmail()}).addOnFailureListener(e -> {});
      }
      
    2. 如果您想在登录后获取电子邮件和姓名

      @覆盖 protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { super.onActivityResult(requestCode, resultCode, data); 开关(请求代码){ 案例 REQUEST_CODE_DRIVE_SIGN_IN: Log.i(TAG, "登录请求码"); // 用户登录后调用。 if (resultCode == RESULT_OK) { Log.i(TAG, "登录成功。"); // 在此处使用最后登录的帐户,因为它已经具有 Drive 范围。 GoogleSignInAccount googleSignInAccount = GoogleSignIn.getLastSignedInAccount(this); googleSignInAccount.getEmail(); mDriveClient = Drive.getDriveClient(this, GoogleSignIn.getLastSignedInAccount(this)); // 构建驱动资源客户端。 mDriveResourceClient = Drive.getDriveResourceClient(this, GoogleSignIn.getLastSignedInAccount(this)); } 打破;}}

    详情可查看here

    【讨论】:

      【解决方案3】:

      看起来像 data Intent 总是 null :(

      public void startResolutionForResult(Activity var1, int var2) throws SendIntentException {
          if(this.hasResolution()) {
              var1.startIntentSenderForResult(this.mPendingIntent.getIntentSender(), var2, (Intent)null, 0, 0, 0);
          }
      }
      

      此代码来自 ConnectionResult.class

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-04
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多