android - newChooseAccountIntent 返回一个名称,但 getToken 需要一个电子邮件

标签 android google-play-services

我开始使用新的 Google Play 服务并尝试使用我在 blog 中找到的信息并在引用示例中创建一个完整的工作应用程序。恕我直言,这些示例中缺少一些东西。

新标准 AccountPicker.newChooseAccountIntent 可用于选择在设备上注册的 Google 帐户。使用该对话框在返回时返回帐户名称。

现在示例显示如何获取 token 。新的 GoogleAuthUtil.getToken 方法需要一封电子邮件来获取 token 。

有些东西不见了。如何从给定的帐户名获取电子邮件?

非常感谢。

public class MyActivity extends Activity {

    public static final String AUTHTOKENSCOPE_DRIVE = "oauth2:https://www.googleapis.com/auth/drive";

    String accountName = "";

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
        switch (requestCode) {
            case 1:
                if (resultCode == RESULT_OK) {
                    accountName = intent.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
                    // Need to fetch token with email
                    // String token = GoogleAuthUtil.getToken(this, <???email???>,  
                           AUTHTOKENSCOPE_DRIVE);
                } else {
                }

                break;
            default:
                super.onActivityResult(requestCode, resultCode, intent);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        int rc = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
        switch (rc) {
            case ConnectionResult.SUCCESS:
                Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[] {
                        "com.google"
                },
                        true, null, AUTHTOKENSCOPE_DRIVE, new String[] {
                            "Just a text"
                        }, null);
                startActivityForResult(intent, 1);
                break;
        }
    }
}

最佳答案

对于 Google 帐户,电子邮件地址帐户名。

所以这应该适合你:

String token = GoogleAuthUtil.getToken(this, accountName, AUTHTOKENSCOPE_DRIVE);

要重新检查,有一个 Account 对象可用于此 accountName 您也可以调用

GoogleAccountManager accountManager = new GoogleAccountManager(context);
Account account = accountManager.getAccountByName(accountName);

证明

来自blog post你已经提到了:

Second, you don’t need an android.accounts.Account object, you just use the email-address string (available in account.name) that uniquely identifies it.

来自谷歌的Calendar API sample application for Android , GoogleAccountCredential.getAccountName()方法:

/**
 * Returns the selected Google account name (e-mail address), for example
 * {@code "johndoe@gmail.com"}, or {@code null} for none.
 */
public String getAccountName() {
    return accountName;
}

他们还使用:

GoogleAuthUtil.getToken(context, accountName, scope);

关于android - newChooseAccountIntent 返回一个名称,但 getToken 需要一个电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12758101/

相关文章:

java - Android 无法生成 View 绑定(bind) com.sun.tools.javac.code.Symbol$CompletionFailure :

android - 光传感器收集不准确的数据

android - ViewPagerIndicator:标签标题的多行文本?

android - 如果我在新帐户中重新发布具有新程序包名称的旧应用程序,是否会违反模拟政策?

android - 使用 PendingIntent 获取位置始终返回 Null

android - 运行应用程序失败并出现错误 'com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex'

java - Android 加速度计和磁力计同时读数

具有 Google Play 服务位置的 Android 服务导致应用程序随机打开

android - SettingsClient 的位置请求总是得到 RESULT_CANCELED

android - 版本冲突更新到播放服务 9.4.0 Android studio 2.2