420 votes

Comment obtenir l'adresse e-mail principale de l'appareil Android

Comment obtenez-vous l'adresse e-mail principale de l'Android (ou une liste d'adresses e-mail)?

Je crois comprendre que sur OS 2.0+, plusieurs adresses de messagerie sont prises en charge, mais en dessous de la version 2.0, vous ne pouvez avoir qu'une adresse e-mail par périphérique.

752voto

Roman Nurik Points 18632

Il y a plusieurs façons de le faire, illustré ci-dessous.

Comme un avertissement amical, être prudent et à l'avant à l'utilisateur lorsque vous traitez avec de compte, son profil, et des données de contact. Si vous avez une mauvaise utilisation d'une adresse électronique de l'utilisateur ou d'autres informations personnelles, de mauvaises choses peuvent arriver.

Méthode A. Utiliser AccountManager (API de niveau 5+)

Vous pouvez utiliser AccountManager.getAccounts ou AccountManager.getAccountsByType pour obtenir une liste de tous les noms de compte sur l'appareil. Heureusement, pour certains types de comptes (y compris com.google), les noms de compte sont des adresses e-mail. Exemple extrait de code ci-dessous.

Pattern emailPattern = Patterns.EMAIL_ADDRESS; // API level 8+
Account[] accounts = AccountManager.get(context).getAccounts();
for (Account account : accounts) {
    if (emailPattern.matcher(account.name).matches()) {
        String possibleEmail = account.name;
        ...
    }
}

À noter que cela nécessite l' GET_ACCOUNTS autorisation:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />

Plus sur l'utilisation de l' AccountManager peut être trouvé à l' Gestionnaire de Contacts un exemple de code dans le SDK.

La Méthode B. Utilisation ContactsContract.Profil (API level 14+)

Comme d'Android 4.0 (Ice Cream Sandwich), vous pouvez obtenir de l'utilisateur, adresses e-mail en accédant à leur profil. Accéder au profil de l'utilisateur est un peu lourd car il nécessite deux autorisations (plus de détails ci-dessous), mais les adresses de courriel sont assez sensibles éléments de données, c'est le prix d'admission.

Ci-dessous est un exemple complet qui utilise un CursorLoader de récupérer le profil des lignes de données contenant des adresses e-mail.

public class ExampleActivity extends Activity implements LoaderManager.LoaderCallbacks<Cursor> {
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getLoaderManager().initLoader(0, null, this);
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle arguments) {
        return new CursorLoader(this,
                // Retrieve data rows for the device user's 'profile' contact.
                Uri.withAppendedPath(
                        ContactsContract.Profile.CONTENT_URI,
                        ContactsContract.Contacts.Data.CONTENT_DIRECTORY),
                ProfileQuery.PROJECTION,

                // Select only email addresses.
                ContactsContract.Contacts.Data.MIMETYPE + " = ?",
                new String[]{ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE},

                // Show primary email addresses first. Note that there won't be
                // a primary email address if the user hasn't specified one.
                ContactsContract.Contacts.Data.IS_PRIMARY + " DESC");
    }

    @Override
    public void onLoadFinished(Loader<Cursor> cursorLoader, Cursor cursor) {
        List<String> emails = new ArrayList<String>();
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            emails.add(cursor.getString(ProfileQuery.ADDRESS));
            // Potentially filter on ProfileQuery.IS_PRIMARY
            cursor.moveToNext();
        }

        ...
    }

    @Override
    public void onLoaderReset(Loader<Cursor> cursorLoader) {
    }

    private interface ProfileQuery {
        String[] PROJECTION = {
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.IS_PRIMARY,
        };

        int ADDRESS = 0;
        int IS_PRIMARY = 1;
    }
}

Cela nécessite à la fois l' READ_PROFILE et READ_CONTACTS autorisations:

<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

5/6/2012 — Ajout d'infos sur le profil d'accès pour Android 4.0+

56voto

Jorge Cevallos Points 1523

Je sais que je suis trop en retard. Mais cela pourrait être utile à d'autres:

Utiliser AccountPicker pour obtenir l'adresse e-mail de l'utilisateur sans aucune autorisation globale, et permettre à l'utilisateur d'être au courant et d'autoriser ou d'annuler le processus.

6voto

AGrunewald Points 798

C’est tout à fait la chose difficile à faire dans Android et je n’ai pas encore fait. Mais peut-être que ces liens peuvent vous aider :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X