Выберите электронное письмо с помощью учетной записи 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"}
Большое спасибо
Ответы
Ответ 1
В соответствии с документами третий параметр 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);
возвращается на мое устройство:
![Choose an account]()
Обратите внимание, что AccountPicker
класс входит в пакет Google Play Services, можно использовать AccountManager.newChooseAccountIntent()
(добавлен в уровень API 14) и получить те же результаты.
Надеюсь, что это поможет.
Ответ 2
После копания я, наконец, закончил загрузку каждого связанного приложения (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 Mail:
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);
}
}