newChooseAccountIntent возвращает имя, но для getToken требуется электронная почта

Я начал с новых сервисов Google Play и попытался использовать информацию, которую нашел в blog и в указанном примере для создания полноценного рабочего приложения. ИМХО в этих примерах чего-то не хватает.

Новый стандартный 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;
        }
    }
}

person Harald Wilhelm    schedule 06.10.2012    source источник


Ответы (1)


Для учетных записей Google адрес электронной почты является именем учетной записи.

Так что это должно работать для вас:

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

Чтобы перепроверить наличие объекта Account для этого accountName, вы также можете вызвать

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

Доказательства

Из сообщения в блоге, на которое вы уже ссылались:

Во-вторых, вам не нужен объект android.accounts.Account, вы просто используете строку адреса электронной почты (доступную в account.name), которая однозначно идентифицирует его.

Из Пример API календаря для Android, GoogleAccountCredential.getAccountName() метод:

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

Там же используют:

GoogleAuthUtil.getToken(context, accountName, scope);
person Jan Gerlinger    schedule 06.10.2012
comment
Большое спасибо. Меня сбило с толку то, что неработающий пример (Activity без onCreate) использовал имя учетной записи и адрес электронной почты в одном и том же блоге кода, не показывая, откуда приходит электронная почта. - person Harald Wilhelm; 06.10.2012