62 votes

Obtenir seulement l'adresse e-mail de la liste de contacts Android

Je veux afficher uniquement les noms de contact dont l'adresse e-mail est présente. Sinon, ce nom de contact ne doit pas être affiché dans la liste. Comment puis-je faire cela? Est-ce que quelqu'un pourrait s'il vous plaît m'aider?

123voto

Marcin Points 995

Voici ma requête super rapide pour extraire les adresses e-mail. C'est beaucoup plus rapide que de récupérer toutes les colonnes de contact comme le suggèrent d'autres réponses...

public ArrayList getNameEmailDetails() {
    ArrayList emlRecs = new ArrayList();
    HashSet emlRecsHS = new HashSet();
    Context context = getActivity();
    ContentResolver cr = context.getContentResolver();
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.Contacts.PHOTO_ID,
            ContactsContract.CommonDataKinds.Email.DATA, 
            ContactsContract.CommonDataKinds.Photo.CONTACT_ID };
    String order = "CASE WHEN " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
            + ContactsContract.Contacts.DISPLAY_NAME 
            + ", " 
            + ContactsContract.CommonDataKinds.Email.DATA
            + " COLLATE NOCASE";
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''";
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order);
    if (cur.moveToFirst()) {
        do {
            // names comes in hand sometimes
            String name = cur.getString(1);
            String emlAddr = cur.getString(3);

            // keep unique only
            if (emlRecsHS.add(emlAddr.toLowerCase())) {
                emlRecs.add(emlAddr);
            }
        } while (cur.moveToNext());
    }

    cur.close();
    return emlRecs;
}

J'ai essayé le code fourni par 'Agarwal Shankar' mais cela a pris environ 4 secondes pour obtenir les contacts sur mon appareil de test, et ce code a pris environ 0,04 sec.

0 votes

Réponse ultime.. Doit utiliser celui-ci

0 votes

Super rapide, bien plus rapide que l'autre solution.

0 votes

Cela devrait être la réponse. Pas l'autre. +1

78voto

Agarwal Shankar Points 14558
public ArrayList getNameEmailDetails(){
        ArrayList names = new ArrayList();
        ContentResolver cr = getContentResolver();
        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
        if (cur.getCount() > 0) {
            while (cur.moveToNext()) {
                String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                Cursor cur1 = cr.query( 
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                                new String[]{id}, null); 
                while (cur1.moveToNext()) { 
                    //pour obtenir les noms de contact
                    String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    Log.e("Nom :", name);
                    String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                    Log.e("Email", email);
                    if(email!=null){
                        names.add(name);
                    }
                } 
                cur1.close();
            }
        }
        return names;
    }

la méthode ci-dessus retourne une arraylist de noms ayant une adresse e-mail.

0 votes

Je reçois les noms de contact et les adresses e-mail dans ArrayList. J'ai vu dans le journal comme ceci : Nom: abc@gmail.com, Email: abc@gmail.com, Nom: xyz@gmai.com, Email: xyz@gmail.com, Nom: xyz, Email:xyz@gmail.com. Cela signifie que je reçois un mélange de noms et d'adresses e-mail dans le nom de contact :(

0 votes

Il ne donne pas le nom. Il donne seulement l'adresse e-mail.

1 votes

Et n'oubliez pas d'ajouter l'autorisation "lire les contacts" :

3voto

Agarwal Shankar Points 14558
si (cur.getCount() > 0) {
          while (cur.moveToNext()) {
              String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
              String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

              Cursor emailCur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id},null); 
              while (emailCur.moveToNext()) { 
                      String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                      Log.e("Email",name+" "+email);
                  } 
                  emailCur.close();
              }

          }

2voto

DariusL Points 2257

Une autre solution.

private static final Uri URI_CONTACT_DATA = ContactsContract.Data.CONTENT_URI;
private static final String COLUMN_EMAIL = ContactsContract.CommonDataKinds.Email.ADDRESS;
private static final String COLUMN_DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY;
private static final String COLUMN_MIMETYPE = ContactsContract.Data.MIMETYPE;

private static final String[] PROJECTION = {
        COLUMN_DISPLAY_NAME,
        COLUMN_EMAIL,
        COLUMN_MIMETYPE
};

private Cursor getCursor() {
    ContentResolver resolver = context.getContentResolver();
    String selection = COLUMN_MIMETYPE + "=?";
    final String[] selectionArgs = {ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE};
    return resolver.query(URI_CONTACT_DATA, PROJECTION, selection, selectionArgs, null);
}

Le problème est que la table à ContactsContract.Contacts.CONTENT_URI contient l'ensemble de la base de données de contacts. Cela inclut les numéros de téléphone, les emails, les organisations et même des données entièrement personnalisées, donc vous ne pouvez pas l'utiliser sans filtrer avec ContactsContract.Data.MIMETYPE. Une ligne dans cette base de données contient une valeur (ou des valeurs, elle a 15 colonnes génériques) liées à un certain compte, vous pourriez donc avoir besoin de les regrouper vous-même. J'avais besoin de cela pour l'autocomplétion des emails, donc le format (email par ligne) était parfait.

0voto

Aneh Thakur Points 79

Voici un moyen simple d'obtenir l'identifiant email du contact de la liste de contacts. Vous devez passer l'identifiant de contact de l'utilisateur dans la méthode ci-dessous et elle vous renverra l'adresse e-mail si elle existe

 public String getEmail(String contactId) {
    String emailStr = "";
    final String[] projection = new String[]{ContactsContract.CommonDataKinds.Email.DATA,
            ContactsContract.CommonDataKinds.Email.TYPE};

    Cursor emailq = managedQuery(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, ContactsContract.Data.CONTACT_ID + "=?", new String[]{contactId}, null);

    if (emailq.moveToFirst()) {
        final int contactEmailColumnIndex = emailq.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);

        while (!emailq.isAfterLast()) {
            emailStr = emailStr + emailq.getString(contactEmailColumnIndex) + ";";
            emailq.moveToNext();
        }
    }
    return emailStr;
}

Et si vous voulez apprendre comment obtenir la liste de contacts dans votre application, suivez ce lien : afficher la liste de contacts dans l'application android - trinitytuts

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