22

我试图让用户使用以下代码选择一个电子邮件帐户:

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"}

非常感谢你

4

3 回答 3

24

根据文档,第三个参数是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 中添加)并获得相同的结果。

希望这可以帮助。

于 2014-10-30T23:54:40.793 回答
10

在四处寻找之后,我终于下载了所有相关的应用程序(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,实时):com.outlook.Z7.eas
  • 领英:com.linkedin.android
  • Facebook:com.facebook.auth.login
  • 推特:com.twitter.android.auth.login
  • Android Mail 应用程序中使用的所有其他 Imap 电子邮件帐户:(com.google.android.legacyimap感谢 Ozbek)
  • 当然还有谷歌:com.google

我仍然缺少雅虎帐户类型,导致雅虎邮件应用程序在我的设备上不断崩溃。

所以希望各位有雅虎账号类型的请分享一下。

2015 年 7 月 12 日修订版,提供更好的解决方案

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);
    }
}
于 2015-01-06T18:26:29.063 回答
2

现在是 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)
于 2019-12-13T09:58:34.553 回答