从Google Drive Android API获取账户名/电子邮件

7
我正在使用新的Google Drive Android API,我可以连接并做它允许我做的一切,但是为了使用SpreadsheetService,我需要从已登录用户中提取accountName/email。
我该怎么做?
这是我连接Google Drive API的代码。它工作得很好。
private void connect() {

    if (isGooglePlayServicesAvailable()) {
        if (mGoogleApiClient == null) {
            mGoogleApiClient = new GoogleApiClient.Builder(this)
                    .addApi(Drive.API)
                    .addScope(Drive.SCOPE_FILE)
                    .addConnectionCallbacks(this)
                    .addOnConnectionFailedListener(this)
                    .build();
        }
        // And, connect!

        if (!mGoogleApiClient.isConnecting() && !mGoogleApiClient.isConnected()) {
            mGoogleApiClient.connect();
            writeLog("Connecting...");
        }

    }
}

这里我正在使用SpreadsheetService API,但我需要账户名来获取令牌
String accountName = "???"; // how do I get this From GoogleClientApi / mGoogleApiClient ?
String accessToken = GoogleAuthUtil.getTokenWithNotification(GDriveActivity.this, accountName, scope, null);
SpreadsheetService service = new SpreadsheetService("v1");

我尝试了添加这个:

String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient);

... 在onConnected方法中调用,但是它抛出了NullPointerException异常。

另外,这里是我的权限:

<uses-permission
    android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission
    android:name="android.permission.VIBRATE" />
<uses-permission
    android:name="android.permission.INTERNET" />
<uses-permission
    android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission
    android:name="android.permission.GET_ACCOUNTS" />
<uses-permission
    android:name="android.permission.NETWORK" />
<uses-permission
    android:name="android.permission.USE_CREDENTIALS" />

请阅读以下链接:https://developers.google.com/+/mobile/android/people - Raghuram
2个回答

14

您需要添加:

                    .addApi(Plus.API)

在构建客户端时,这将在onConnected(Bundle)中起作用:
String accountName = Plus.AccountApi.getAccountName(mGoogleApiClient);

假设您已经拥有了正确的权限(而您确实拥有):

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

5
只使用com.google.android.gms:play-services-identity,是否可能不使用Plus API? - Roel
现在加号已经被弃用了。 - Jaydev

4

我现在已经回到了如下代码,这可以使我随时获取账户信息。

当我提出这个问题的时候,我以为只有在初始连接时才能获取账户信息,显然我错了。

private String getAccountName() {

    String accountName = null;

    AccountManager manager = (AccountManager) getSystemService(ACCOUNT_SERVICE);
    Account[] list = manager.getAccounts();
    for (Account account : list) {
        if (account.type.equalsIgnoreCase("com.google")) {
            accountName = account.name;
            break;
        }
    }
    return accountName;
}

当然,在AndroidManifest中包括以下权限:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

如果您有多个谷歌账户怎么办?那么您只需自动选择第一个。 - Roel
2
我同意Roel的观点,如果你有多个账户怎么办?这是我找到的唯一一个与我面临的问题相同的主题。我需要Google Drive已登录用户的电子邮件。我们已经有真正的解决方案了吗? - Lucas Eduardo
@LucasEduardo,你找到任何解决方案了吗? - osayilgan
说句实话,我现在正在使用Google EasyPermissions。这会弹出一个窗口供用户选择要使用哪个帐户。 https://developers.google.com/sheets/api/quickstart/android - LimaNightHawk
哦,我正在使用弹出窗口询问用户要选择哪个帐户,就像LimaNightHawk上面说的那样。 - Lucas Eduardo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接