web-dev-qa-db-ja.com

AccountPicker.newChooseAccountIntentを使用してメールを選択します

次のコードを使用して、ユーザーにメールアカウントを選択させようとしています。

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

このコードはうまく機能しますが、ユーザーがGmailアカウントを持っていないが、Yahoo、Hotmailなどを持っている場合。3番目のパラメーターを変更してすべての電子メールアカウントを表示するにはどうすればよいですか。

new String[]{"com.google"}

どうもありがとうございました

19
Udi Oshi

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)
0
Rugbrød

ドキュメントによると、3番目のパラメータは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開発者サービスパッケージの一部であることに注意してください。代わりに AccountManager.newChooseAccountIntent() (APIレベル14で追加)を使用できます。同じ結果が得られます。

お役に立てれば。

23
ozbek

掘り下げた後、私は最終的にすべての関連アプリ(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
  • Androidメールアプリ:com.google.Android.legacyimap(Ozbekに感謝)で使用される他のすべてのImapメールアカウント
  • そしてもちろんグーグル: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);
    }
}
8
Bassel Mourjan