Выберите письмо, используя 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"}
большое спасибо
2 ответа
Согласно документам, третий параметр allowableAccountTypes
:
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, можно использовать AccountManager.newChooseAccountIntent()
(добавлен на уровне API 14) вместо этого и получить те же результаты.
Надеюсь это поможет.
Покопавшись, я наконец-то загрузил все связанные приложения (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 (Hotmail, Live):
com.outlook.Z7.eas
- LinkedIn:
com.linkedin.android
- facebook:
com.facebook.auth.login
- Twitter:
com.twitter.android.auth.login
- Все остальные учетные записи электронной почты Imap, используемые в приложении Почта Android:
com.google.android.legacyimap
(Спасибо Озбеку) - и, конечно, Google:
com.google
Мне по-прежнему не хватает типа учетной записи Yahoo, потому что почтовое приложение Yahoo продолжало зависать на моем устройстве.
Поэтому я надеюсь, что если у вас есть тип учетной записи Yahoo, пожалуйста, поделитесь им.
ПЕРЕСМОТР 7-12-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);
}
}
Это 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)