Выберите адрес электронной почты с помощью AccountPicker.newChooseAccountIntent

Я пытаюсь позволить пользователю выбрать учетную запись электронной почты, используя следующий код:

Intent intent = AccountPicker.newChooseAccountIntent(null, null, new String[]{"com.google"},
                            false, null, null, null, null);
                    startActivityForResult(intent, 23);

Этот код отлично работает, но если у пользователя нет учетной записи Gmail, а есть Yahoo, Hotmail и т. д. Как я могу отобразить все учетные записи электронной почты, изменив третий параметр:

new String[]{"com.google"}

Большое тебе спасибо


person Udi Oshi    schedule 04.03.2014    source источник


Ответы (3)


Это 2019 год, и код больше не работает. Чтобы все учетные записи отображались в средстве выбора (с помощью Xamarin Android), вместо

Android.Gms.Common.AccountPicker.NewChooseAccountIntent(null, null, 
null, false, null, null, null, null);

вы должны использовать

Android.Accounts.AccountManager.NewChooseAccountIntent(null,null,null,null,null,null,null)
person Rugbrød    schedule 13.12.2019
comment
Вопрос конкретно о AccountPicker.newChooseAccountIntent() классе/методе. - person ozbek; 14.12.2019
comment
Возможно, вы правы... (почему он был выбран в качестве ответа?) - person Rugbrød; 16.12.2019

Согласно документам, третий параметр — allowableAccountTypes:

допустимые типы аккаунтов

необязательный строковый массив типов учетных записей. Они используются как для фильтрации отображаемых учетных записей, так и для фильтрации списка типов учетных записей, отображаемых при добавлении учетной записи.

Для учетных записей IMAP в приложении электронной почты этот тип возвращается как "com.google.android.legacyimap" (пожалуйста, не регистрируйте сведения об учетных записях в рабочей среде):

AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType(null);
for (Account account : accounts) {
    Log.d(TAG, "account: " + account.name + " : " + account.type);
}

Это использование (добавьте все типы учетных записей, которые вам нужны, в массив)

Intent intent = AccountPicker.newChooseAccountIntent(null, null,
        new String[] {"com.google", "com.google.android.legacyimap"},
        false, null, null, null, null);

возвращает следующее на моем устройстве:

Выберите учетную запись

Обратите внимание, что класс AccountPicker является частью Google. Пакет Play Services можно использовать AccountManager.newChooseAccountIntent() (добавлено в уровне API 14) и получить те же результаты.

Надеюсь это поможет.

person ozbek    schedule 30.10.2014
comment
Спасибо, это полезно - person Bassel Mourjan; 01.11.2014
comment
Какую зависимость Gradle вы использовали для этого? Включение compile 'com.google.android.gms:play-services:9.0.2' может привести к ограничению в 65 КБ. - person Shubham A.; 04.06.2016
comment
@ShubhamA. Извините, это было уже давно, и я не помню. Если ваша минимальная версия SDK 14+, вы можете вместо этого использовать AccountManager.newChooseAccountIntent(). - person ozbek; 04.06.2016
comment
@ozbek Это вызывает намерение, которое отображает список учетных записей с устройства. но если учетной записи не существует, она перенаправляет меня на вход в Google Windows (что происходит при первом входе в учетную запись загрузки). Я не видел никаких параметров в newChoolseAccoutnIntent. Как выйти из этой ситуации? - person xaif; 12.08.2019
comment
@xaif: пожалуйста, задайте новый вопрос и определите, как выйти из этой ситуации? - person ozbek; 15.08.2019

После того, как я покопался, я, наконец, загрузил все связанные приложения (outlook, linkedin, twitter...) и выгрузил там типы учетных записей, используя следующий код:

public void pickUserAccount() {
    /*This will list all available accounts on device without any filtering*/
    Intent intent = AccountPicker.newChooseAccountIntent(null, null,
            null, false, null, null, null, null);   
    startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
}
/*After manually selecting every app related account, I got its Account type using the code below*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE_PICK_ACCOUNT) {
        // Receiving a result from the AccountPicker
        if (resultCode == RESULT_OK) {
            System.out.println(data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE));
            System.out.println(data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME));
        } else if (resultCode == RESULT_CANCELED) {
            Toast.makeText(this, R.string.pick_account, Toast.LENGTH_LONG).show();
        }
    }
}

И это следующие результаты, которые я получил:

  • Outlook (горячая почта, Live):com.outlook.Z7.eas
  • LinkedIn: com.linkedin.android
  • Фейсбук: com.facebook.auth.login
  • Твиттер: com.twitter.android.auth.login
  • Все остальные учетные записи электронной почты Imap, используемые в приложении Android Mail: com.google.android.legacyimap (спасибо Ozbek)
  • и конечно гугл: com.google

Мне все еще не хватает типа учетной записи yahoo, потому что почтовое приложение yahoo постоянно зависало на моем устройстве.

Поэтому я надеюсь, что если у вас есть тип учетной записи Yahoo, пожалуйста, поделитесь им.

ВЕРСИЯ 7 декабря 2015 г. с лучшим решением

Pattern emailPattern = Patterns.EMAIL_ADDRESS;
Account[] accounts = AccountManager.get(getActivity()).getAccounts();
ArrayList<String> emails = new ArrayList<String>();
for (Account account : accounts) {
    if (emailPattern.matcher(account.name).matches()) {
         emails.add(account.name);
    }
}
person Bassel Mourjan    schedule 06.01.2015