newChooseAccountIntent返回一个Name,但getToken需要一个Email

Har*_*elm 2 android google-play-services

我从新的Google Play服务开始,尝试使用我在博客和参考示例中找到的信息来创建一个完整的应用程序.恕我直言,这些例子中缺少一些东西.

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

现在,这些示例显示了如何获取令牌.新的GoogleAuthUtil.getToken方法需要一封电子邮件来获取令牌.

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

提前谢谢了.

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jan*_*ger 6

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

所以这对你有用:

String token = GoogleAuthUtil.getToken(this, accountName, AUTHTOKENSCOPE_DRIVE);
Run Code Online (Sandbox Code Playgroud)

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

GoogleAccountManager accountManager = new GoogleAccountManager(context);
Account account = accountManager.getAccountByName(accountName);
Run Code Online (Sandbox Code Playgroud)

证明

从您已经引用的博客文章中:

其次,您不需要android.accounts.Account对象,只需使用唯一标识它的电子邮件地址字符串(在account.name中可用).

来自Google的适用于AndroidCalendar API示例应用程序,该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;
}
Run Code Online (Sandbox Code Playgroud)

他们还使用:

GoogleAuthUtil.getToken(context, accountName, scope);
Run Code Online (Sandbox Code Playgroud)