web-dev-qa-db-fra.com

Comment lire les contacts sur Android 2.0

Je travaille sur Android 2.0 et j'essaie de recevoir une liste de tous les contacts.

Puisque Android.provider.Contacts.People est obsolète, je dois utiliser Android.provider.ContactsContract, mais je ne trouve pas d'exemple approprié pour l'utiliser ( ex: récupérer une liste de tous les contacts du répertoire).

Quelqu'un sait où trouver un tel exemple?

95
appme up

Tout d'abord, assurez-vous d'avoir ajouté

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

dans votre fichier AndroidManifest.xml, vous pouvez alors parcourir les contacts de votre téléphone comme suit:

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null); 
while (cursor.moveToNext()) { 
   String contactId = cursor.getString(cursor.getColumnIndex( 
   ContactsContract.Contacts._ID)); 
   String hasPhone = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)); 
   if (Boolean.parseBoolean(hasPhone)) { 
      // You know it has a number so now query it like this
      Cursor phones = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ contactId, null, null); 
      while (phones.moveToNext()) { 
         String phoneNumber = phones.getString(phones.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER));                 
      } 
      phones.close(); 
   }

   Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null); 
   while (emails.moveToNext()) { 
      // This would allow you get several email addresses 
      String emailAddress = emails.getString( 
      emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
   } 
   emails.close();
}
cursor.close(); 

En outre, vous pouvez parcourir vos contacts et simplement obtenir le nom et le numéro de téléphone comme suit:

Cursor people = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

while(people.moveToNext()) {
   int nameFieldColumnIndex = people.getColumnIndex(PhoneLookup.DISPLAY_NAME);
   String contact = people.getString(nameFieldColumnIndex);
   int numberFieldColumnIndex = people.getColumnIndex(PhoneLookup.NUMBER);
   String number = people.getString(numberFieldColumnIndex);
}

people.close();

De plus, si vous avez besoin d'obtenir des informations telles que des notes d'un contact, vous devrez utiliser un autre URI, comme suit (n'hésitez pas à utiliser cette méthode):

private String getNote(long contactId) { 
   String note = null; 
   String[] columns = new String[] { ContactsContract.CommonDataKinds.Note.NOTE }; 
   String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
   String[] whereParameters = new String[]{Long.toString(contactId), ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
   Cursor contacts = getContentResolver().query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null); 
   if (contacts.moveToFirst()) { 
      rv = contacts.getString(0); 
   } 
   contacts.close(); 
   return note; 
} 

Notez que cette fois, j'ai utilisé non seulement l'ID du contact, mais également le type mime pour la requête.

160
Javier Figueroa

C’est formidable de voir quelques informations utiles, c’est frustrant de constater à quel point ce sujet important est couvert par la documentation et autres. Après avoir trop discuté, je pensais partager un peu de code également. Le code suivant est un peu plus joli et permet de faire la même chose plus efficacement.

Uri contactUri = ContactsContract.Contacts.CONTENT_URI;

    String[] PROJECTION = new String[] {

            ContactsContract.Contacts._ID,

            ContactsContract.Contacts.DISPLAY_NAME,

            ContactsContract.Contacts.HAS_PHONE_NUMBER,

    };

String SELECTION = ContactsContract.Contacts.HAS_PHONE_NUMBER + "='1'";

Cursor contacts = managedQuery(contactUri, PROJECTION, SELECTION, null, null );

Le bloc de code ci-dessus renvoie un curseur qui pointe vers la requête résultante qui ne contient que les lignes qui ont un numéro de téléphone. C'est bien puisque vous avez généralement beaucoup de contacts sans numéro. En outre, PROJECTION limite la quantité de données renvoyée.

String key, value, phoneNumber; 

Hashtable contactPhoneInfo = new Hashtable<String, String>();

Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI; 

String [] PHONES_PROJECTION = new String[] { ContactsContract.CommonDataKinds.Phone.NUMBER };

String PHONE_SELECTION = null; 

        contacts.moveToFirst();

        do{

         long contactId = contacts.getLong(idColumnIndex); 

         PHONE_SELECTION = ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId; 

         Cursor phones = managedQuery(phoneUri,
           PHONES_PROJECTION,
           null, 
           null,
                    ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC");


         phones.moveToFirst(); 

         key = phones.getString(0).replaceAll("\\D", "");

         value = contacts.getString(nameColumnIndex); 

         contactPhoneInfo.put(key, value); 

        }while(contacts.moveToNext()); 

        contacts.close(); 
}

Le bloc ci-dessus obtient le numéro de téléphone associé à chaque identifiant de contact associé à un numéro de téléphone. Je stocke toutes les informations dans une table de hachage et avec une valeur clé du numéro de téléphone. J'ai enlevé le numéro de téléphone de toutes les informations sans chiffres également. Pour une raison quelconque, même si ContactsContract.CommonDataKinds.Phone.HAS_PHONE_NUMBER est valide si vous incluez cela dans l'argument de projection, il casse la requête, je ne sais pas pourquoi et c'est frustrant.

La deuxième partie du code ci-dessus est trop lente, tous les appels de requête enlèvent tout. Le code suivant est beaucoup plus rapide. Il suffit de saisir toutes les lignes du contenu du téléphone et d’utiliser les contact_ids pour trier les données souhaitées.

Cursor phones = managedQuery(phoneUri,
                PHONES_PROJECTION,
                PHONE_SELECTION, 
                null,
                ContactsContract.CommonDataKinds.Phone.IS_SUPER_PRIMARY + " DESC");

contacts.moveToFirst();

        do{

            value = ""; 

            key = contacts.getString(idColumnIndex); 

            contactPhoneInfo.put(key, value);

        }while(contacts.moveToNext());

phones.moveToFirst();

        Set keySet = contactPhoneInfo.keySet(); 

        idColumnIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);

        int numColumnIndex = phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); 

        do{

            key = phones.getString(idColumnIndex);  

            if(keySet.contains(key)){

                value = phones.getString(numColumnIndex).replaceAll("\\D", ""); 

                contactPhoneInfo.put(key, value); 

            }


        }while(phones.moveToNext()); 

Vous vous retrouvez avec une table de hachage avec toutes les informations souhaitées. Bien sûr, vous pouvez insérer les informations souhaitées dans la structure de données. La deuxième façon de le faire est beaucoup plus rapide.

22
thisnamagain

Je veux juste ajouter que lorsque vous récupérez des contacts, vous risquez de recevoir un grand nombre de contacts "parasites" - par exemple, certaines adresses électroniques auxquelles un utilisateur a éventuellement envoyé un courrier électronique, mais ne sont pas agrégées ... Si vous souhaitez uniquement les contacts visibles par l'utilisateur, comme dans l'application de contacts propres d'Androids, vous devez limiter la sélection à IN_VISIBLE_GROUP uniquement.

    String where = ContactsContract.Contacts.IN_VISIBLE_GROUP + "= ? ";
    String[] selectionArgs = new String[] { "1" };
18
stoilkov

Je pense qu'il est important d'avoir le code à partir de cette URL http://coderzheaven.com/2011/06/get-all-details-from-contacts-in-Android/ sur StackOverflow cause parfois des liens comme ça descendent.

 public void readContacts(){
         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));
                String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    System.out.println("name : " + name + ", ID : " + id);

                    // get the phone number
                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                                           ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
                                           new String[]{id}, null);
                    while (pCur.moveToNext()) {
                          String phone = pCur.getString(
                                 pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                          System.out.println("phone" + phone);
                    }
                    pCur.close();

                    // get email and type

                   Cursor emailCur = cr.query(
                            ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                            new String[]{id}, null);
                    while (emailCur.moveToNext()) {
                        // This would allow you get several email addresses
                            // if the email addresses were stored in an array
                        String email = emailCur.getString(
                                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                        String emailType = emailCur.getString(
                                      emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));

                      System.out.println("Email " + email + " Email Type : " + emailType);
                    }
                    emailCur.close();

                    // Get note.......
                    String noteWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                    String[] noteWhereParams = new String[]{id,
                    ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE};
                            Cursor noteCur = cr.query(ContactsContract.Data.CONTENT_URI, null, noteWhere, noteWhereParams, null);
                    if (noteCur.moveToFirst()) {
                        String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
                      System.out.println("Note " + note);
                    }
                    noteCur.close();

                    //Get Postal Address....

                    String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                    String[] addrWhereParams = new String[]{id,
                        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};
//               Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI,
//                       null, null, null, null);
               Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI,
                       null, addrWhere, addrWhereParams, null);

                    while(addrCur.moveToNext()) {
                        String poBox = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
                        String street = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
                        String city = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
                        String state = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
                        String postalCode = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
                        String country = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
                        String type = addrCur.getString(
                                     addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));

                        // Do something with these....

                    }
                    addrCur.close();

                    // Get Instant Messenger.........
                    String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                    String[] imWhereParams = new String[]{id,
                        ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
                    Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI,
                            null, imWhere, imWhereParams, null);
                    if (imCur.moveToFirst()) {
                        String imName = imCur.getString(
                                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
                        String imType;
                        imType = imCur.getString(
                                 imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
                    }
                    imCur.close();

                    // Get Organizations.........

                    String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
                    String[] orgWhereParams = new String[]{id,
                        ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
                    Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI,
                                null, orgWhere, orgWhereParams, null);
                    if (orgCur.moveToFirst()) {
                        String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
                        String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
                    }
                    orgCur.close();
                }
            }
       }
    }

texte souligné

14
Ajibola

J'ai trouvé une solution très facile à lire les contacts. (ennuyeux d'écrire du code pour lire chaque valeur, donc c'est bien d'utiliser la classe wrapper pour les contacts)

Bien sûr <uses-permission Android:name="Android.permission.READ_CONTACTS"/>

ContactList.Java

package com.test;

import Java.util.ArrayList;

public class ContactList {
private ArrayList<Contact> contacts = new ArrayList<Contact>();

public ArrayList<Contact> getContacts() {
    return contacts;
}

public void setContacts(ArrayList<Contact> contacts) {
    this.contacts = contacts;
}

public void addContact(Contact contact) {
     this.contacts.add(contact);
 }

 public ContactList() {

 }
}

Contact.Java

package com.test;

import Java.util.ArrayList;


public class Contact {
private String id;
 private String displayName;
 private ArrayList<Phone> phone;
 private ArrayList<Email> email;
 private ArrayList<String> notes;
 private ArrayList<Address> addresses = new ArrayList<Address>();
 private ArrayList<IM> imAddresses;
 private Organization organization;
public String getId() {
    return id;
}
public void setId(String id) {
    this.id = id;
}
public String getDisplayName() {
    return displayName;
}
public void setDisplayName(String displayName) {
    this.displayName = displayName;
}
public ArrayList<Phone> getPhone() {
    return phone;
}
public void setPhone(ArrayList<Phone> phone) {
    this.phone = phone;
}
public void addPhone(Phone phone) {
     this.phone.add(phone);
 }
public ArrayList<Email> getEmail() {
    return email;
}
public void setEmail(ArrayList<Email> email) {
    this.email = email;
}
public void addEmail(Email email) {
     this.email.add(email);
 }
public ArrayList<String> getNotes() {
    return notes;
}
public void setNotes(ArrayList<String> notes) {
    this.notes = notes;
}
public void AddNotes(String notes){
    this.notes.add(notes);
}
public ArrayList<Address> getAddresses() {
    return addresses;
}
public void setAddresses(ArrayList<Address> addresses) {
    this.addresses = addresses;
}
public void addAddress(Address address) {
     this.addresses.add(address);
 }
public ArrayList<IM> getImAddresses() {
    return imAddresses;
}
public void setImAddresses(ArrayList<IM> imAddresses) {
    this.imAddresses = imAddresses;
}
public void addImAddresses(IM imAddr) {
     this.imAddresses.add(imAddr);
 }
public Organization getOrganization() {
    return organization;
}
public void setOrganization(Organization organization) {
    this.organization = organization;
}
}

Adresse.Java

package com.test;

public class Address {
private String poBox;
 private String street;
 private String city;
 private String state;
 private String postalCode;
 private String country;
 private String type;
 private String asString = "";

 public String getType() {
     return type;
 }
 public void setType(String type) {
     this.type = type;
 }
 public String getPoBox() {
     return poBox;
 }
 public void setPoBox(String poBox) {
     this.poBox = poBox;
 }
 public String getStreet() {
     return street;
 }
 public void setStreet(String street) {
     this.street = street;
 }
 public String getCity() {
     return city;
 }
 public void setCity(String city) {
     this.city = city;
 }
 public String getState() {
     return state;
 }
 public void setState(String state) {
     this.state = state;
 }
 public String getPostalCode() {
     return postalCode;
 }
 public void setPostalCode(String postalCode) {
     this.postalCode = postalCode;
 }
 public String getCountry() {
     return country;
 }
 public void setCountry(String country) {
     this.country = country;
 }
 public String toString() {
     if (this.asString.length() > 0) {
         return(this.asString);
     } else {
         String addr = "";
         if (this.getPoBox() != null) {
             addr = addr + this.getPoBox() + "n";
         }
         if (this.getStreet() != null) {
             addr = addr + this.getStreet() + "n";
         }
         if (this.getCity() != null) {
             addr = addr + this.getCity() + ", ";
         }
         if (this.getState() != null) {
             addr = addr + this.getState() + " ";
         }
         if (this.getPostalCode() != null) {
             addr = addr + this.getPostalCode() + " ";
         }
         if (this.getCountry() != null) {
             addr = addr + this.getCountry();
         }
         return(addr);
     }
 }

 public Address(String asString, String type) {
     this.asString = asString;
     this.type = type;
 }

 public Address(String poBox, String street, String city, String state, 
         String postal, String country, String type) {
     this.setPoBox(poBox);
      this.setStreet(street);
     this.setCity(city);
     this.setState(state);
     this.setPostalCode(postal);
     this.setCountry(country);
     this.setType(type);
 }
}

Email.Java

package com.test;

public class Email {
private String address;
 private String type;
 public String getAddress() {
     return address;
 }
 public void setAddress(String address) {
     this.address = address;
 }
 public String getType() {
     return type;
 }
 public void setType(String t) {
     this.type = t;
 }

 public Email(String a, String t) {
     this.address = a;
     this.type = t;
 }
}

Im.Java

package com.test;

public class IM {
private String name;
 private String type;
 public String getName() {
     return name;
 }
 public void setName(String name) {
     this.name = name;
 }
 public String getType() {
     return type;
 }
 public void setType(String type) {
     this.type = type;
 }

 public IM(String name, String type) {
     this.name = name;
     this.type = type;
 }
}

Organisation.Java

package com.test;

public class Organization {
private String organization = "";
 private String title = "";
 public String getOrganization() {
     return organization;
 }
 public void setOrganization(String organization) {
     this.organization = organization;
 }
 public String getTitle() {
     return title;
 }
 public void setTitle(String title) {
     this.title = title;
 }

 public Organization() {

 }
 public Organization(String org, String title) {
     this.organization = org;
     this.title = title;
 }
}

Phone.Java

package com.test;

public class Phone {
private String number;
 private String type;

 public String getNumber() {
     return number;
 }

 public void setNumber(String number) {
     this.number = number;
 }

 public String getType() {
     return type;
 }

 public void setType(String type) {
     this.type = type;
 }

 public Phone(String n, String t) {
     this.number = n;
     this.type = t;
 }
}

ContactAPI.Java

package com.test;

import Android.content.ContentResolver;
import Android.content.Intent;
import Android.database.Cursor;
import Android.os.Build;

public abstract class ContactAPI {
private static ContactAPI api;

 public static ContactAPI getAPI() {
     if (api == null) {
         String apiClass;
         if (Integer.parseInt(Build.VERSION.SDK) >= Build.VERSION_CODES.Eclair) {
             apiClass = "com.*********.ContactAPISdk5";
         } else {
             apiClass = "com.*********.ContactAPISdk3";
         }

         try {
             Class<? extends ContactAPI> realClass = Class.forName(apiClass).
                 asSubclass(ContactAPI.class);
             api = realClass.newInstance();
         } catch (Exception e) {
             throw new IllegalStateException(e);
         }

     }
     return api;
 }

 public abstract Intent getContactIntent();

 public abstract ContactList newContactList();

 public abstract Cursor getCur();
 public abstract void setCur(Cursor cur);

 public abstract ContentResolver getCr();
 public abstract void setCr(ContentResolver cr);

}

ContactAPISdk5.Java

package com.test;
import Java.util.ArrayList;
import Android.content.ContentResolver;
import Android.content.Intent;
import Android.database.Cursor;
import Android.provider.ContactsContract;

public class ContactAPISdk5 extends ContactAPI {

 private Cursor cur;
 private ContentResolver cr;


 public Cursor getCur() {
     return cur;
 }

 public void setCur(Cursor cur) {
     this.cur = cur;
 }

 public ContentResolver getCr() {
     return cr;
 }

 public void setCr(ContentResolver cr) {
     this.cr = cr;
 }

 public Intent getContactIntent() {
     return(new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI));
 }

 public ContactList newContactList() {
     ContactList contacts = new ContactList();
     String id;

     this.cur = this.cr.query(ContactsContract.Contacts.CONTENT_URI,
             null, null, null, null);
     if (this.cur.getCount() > 0) {
         while (cur.moveToNext()) {
             Contact c = new Contact();
             id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
             c.setId(id);
             c.setDisplayName(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
             if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                 c.setPhone(this.getPhoneNumbers(id));
             }
             c.setEmail(this.getEmailAddresses(id));
             c.setNotes(this.getContactNotes(id));
             c.setAddresses(this.getContactAddresses(id));
             c.setImAddresses(this.getIM(id));
             c.setOrganization(this.getContactOrg(id));
             contacts.addContact(c);
         }
     }
     return(contacts);
 }

 public ArrayList<Phone> getPhoneNumbers(String id) {
     ArrayList<Phone> phones = new ArrayList<Phone>();

     Cursor pCur = this.cr.query(
             ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
             null, 
             ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
             new String[]{id}, null);
     while (pCur.moveToNext()) {
         phones.add(new Phone(
                 pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
                 , pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE))
         ));

     } 
     pCur.close();
     return(phones);
 }

 public ArrayList<Email> getEmailAddresses(String id) {
     ArrayList<Email> emails = new ArrayList<Email>();

     Cursor emailCur = this.cr.query( 
             ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
             null,
             ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
             new String[]{id}, null); 
     while (emailCur.moveToNext()) { 
         // This would allow you get several email addresses
         Email e = new Email(emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))
                 ,emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE))  
                 );
         emails.add(e);
     } 
     emailCur.close();
     return(emails);
 }

 public ArrayList<String> getContactNotes(String id) {
     ArrayList<String> notes = new ArrayList<String>();
     String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] whereParameters = new String[]{id, 
         ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE}; 
     Cursor noteCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); 
     if (noteCur.moveToFirst()) { 
         String note = noteCur.getString(noteCur.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));
         if (note.length() > 0) {
             notes.add(note);
         }
     } 
     noteCur.close();
     return(notes);
 }

 public ArrayList<Address> getContactAddresses(String id) {
     ArrayList<Address> addrList = new ArrayList<Address>();

     String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] whereParameters = new String[]{id, 
             ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE}; 

     Cursor addrCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); 
     while(addrCur.moveToNext()) {
         String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));
         String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
         String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
         String state = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));
         String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
         String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
         String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
         Address a = new Address(poBox, street, city, state, postalCode, country, type);
         addrList.add(a);
     } 
     addrCur.close();
     return(addrList);
 }

 public ArrayList<IM> getIM(String id) {
     ArrayList<IM> imList = new ArrayList<IM>();
     String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] whereParameters = new String[]{id, 
             ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE}; 

     Cursor imCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null); 
     if (imCur.moveToFirst()) { 
         String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));
         String imType;
         imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));
         if (imName.length() > 0) {
             IM im = new IM(imName, imType);
             imList.add(im);
         }
     } 
     imCur.close();
     return(imList);
 }

 public Organization getContactOrg(String id) {
     Organization org = new Organization();
     String where = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
     String[] whereParameters = new String[]{id, 
             ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE}; 

     Cursor orgCur = this.cr.query(ContactsContract.Data.CONTENT_URI, null, where, whereParameters, null);

     if (orgCur.moveToFirst()) { 
         String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
         String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
         if (orgName.length() > 0) {
             org.setOrganization(orgName);
             org.setTitle(title);
         }
     } 
     orgCur.close();
     return(org);
 }

 }

ContactAPISdk3.Java

package com.test;

import Java.util.ArrayList;

import Android.content.ContentResolver;
import Android.content.Intent;
import Android.database.Cursor;
import Android.provider.Contacts;
import Android.provider.Contacts.People;

public class ContactAPISdk3 extends ContactAPI {

 private Cursor cur;
 private ContentResolver cr;

 public Cursor getCur() {
     return cur;
 }

 public void setCur(Cursor cur) {
     this.cur = cur;
 }

 public ContentResolver getCr() {
     return cr;
 }

 public void setCr(ContentResolver cr) {
     this.cr = cr;
 }

 public Intent getContactIntent() {
     return(new Intent(Intent.ACTION_PICK, People.CONTENT_URI));
 }

 public ContactList newContactList() {
     ContactList contacts = new ContactList();
     String id="";

     this.cur = this.cr.query(People.CONTENT_URI, 
             null, null, null, null);
     if (this.cur.getCount() > 0) {
         while (cur.moveToNext()) {
             Contact c = new Contact();
             id = cur.getString(cur.getColumnIndex(People._ID));
             c.setId(id);
             c.setDisplayName(cur.getString(cur.getColumnIndex(People.DISPLAY_NAME)));
             if (Integer.parseInt(cur.getString(cur.getColumnIndex(People.PRIMARY_PHONE_ID))) > 0) {
                 c.setPhone(this.getPhoneNumbers(id));
             }
             c.setEmail(this.getEmailAddresses(id));
             ArrayList<String> notes = new ArrayList<String>();
             notes.add(cur.getString(cur.getColumnIndex(People.NOTES)));
             c.setNotes(notes);
             c.setAddresses(this.getContactAddresses(id));
             c.setImAddresses(this.getIM(id));
             c.setOrganization(this.getContactOrg(id));
             contacts.addContact(c);
         }
     }
     return(contacts);
 }

 public ArrayList<Phone> getPhoneNumbers(String id) {
     ArrayList<Phone> phones = new ArrayList<Phone>();

     Cursor pCur = this.cr.query(
             Contacts.Phones.CONTENT_URI, 
             null, 
             Contacts.Phones.PERSON_ID +" = ?", 
             new String[]{id}, null);
     while (pCur.moveToNext()) {
         phones.add(new Phone(
                 pCur.getString(pCur.getColumnIndex(Contacts.Phones.NUMBER))
                 , pCur.getString(pCur.getColumnIndex(Contacts.Phones.TYPE))
         ));

     } 
     pCur.close();
     return(phones);
 }

 public ArrayList<Email> getEmailAddresses(String id) {
     ArrayList<Email> emails = new ArrayList<Email>();

     Cursor emailCur = this.cr.query( 
             Contacts.ContactMethods.CONTENT_EMAIL_URI, 
             null,
             Contacts.ContactMethods.PERSON_ID + " = ?", 
             new String[]{id}, null); 
     while (emailCur.moveToNext()) { 
         // This would allow you get several email addresses
         Email e = new Email(emailCur.getString(emailCur.getColumnIndex(Contacts.ContactMethods.DATA))
                 ,emailCur.getString(emailCur.getColumnIndex(Contacts.ContactMethods.CONTENT_EMAIL_TYPE))  
                 );
         emails.add(e);
     } 
     emailCur.close();
     return(emails);
 }

 public ArrayList<Address> getContactAddresses(String id) {
     ArrayList<Address> addrList = new ArrayList<Address>();

     String where = Contacts.ContactMethods.PERSON_ID + " = ? AND " + Contacts.ContactMethods.KIND + " = ?"; 
     String[] whereParameters = new String[]{id, 
             Contacts.ContactMethods.CONTENT_POSTAL_ITEM_TYPE}; 

     Cursor addrCur = this.cr.query(Contacts.ContactMethods.CONTENT_URI, null, where, whereParameters, null); 
     while(addrCur.moveToNext()) {
         String addr = addrCur.getString(addrCur.getColumnIndex(Contacts.ContactMethodsColumns.DATA));
         String type = addrCur.getString(addrCur.getColumnIndex(Contacts.ContactMethodsColumns.TYPE));
         Address a = new Address(addr, type);
         addrList.add(a);
     } 
     addrCur.close();
     return(addrList);
 }

 public ArrayList<IM> getIM(String id) {
     ArrayList<IM> imList = new ArrayList<IM>();
     String where = Contacts.ContactMethods.PERSON_ID + " = ? AND " + Contacts.ContactMethods.KIND + " = ?"; 
     String[] whereParameters = new String[]{id, 
             Contacts.ContactMethods.CONTENT_IM_ITEM_TYPE}; 

     Cursor imCur = this.cr.query(Contacts.ContactMethods.CONTENT_URI, null, where, whereParameters, null); 
     if (imCur.moveToFirst()) { 
         String imName = imCur.getString(imCur.getColumnIndex(Contacts.ContactMethodsColumns.DATA));
         String imType = imCur.getString(imCur.getColumnIndex(Contacts.ContactMethodsColumns.TYPE));
         if (imName.length() > 0) {
             IM im = new IM(imName, imType);
             imList.add(im);
         }
     } 
     imCur.close();
     return(imList);
 }

 public Organization getContactOrg(String id) {
     Organization org = new Organization();
     String where = Contacts.ContactMethods.PERSON_ID + " = ?"; 
     String[] whereParameters = new String[]{id}; 

     Cursor orgCur = this.cr.query(Contacts.Organizations.CONTENT_URI, null, where, whereParameters, null);

     if (orgCur.moveToFirst()) { 
         String orgName = orgCur.getString(orgCur.getColumnIndex(Contacts.Organizations.COMPANY));
         String title = orgCur.getString(orgCur.getColumnIndex(Contacts.Organizations.TITLE));
         if (orgName.length() > 0) {
             org.setOrganization(orgName);
             org.setTitle(title);
         }
     } 
     orgCur.close();
     return(org);
 }
 }

Remarque : N'oubliez pas de changer le nom du paquet à la place *******.

Source (le lien peut être mort à tout moment :))

9
Bhavesh Hirpara

Mettez ceci ....

Cursor phones = 

    getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
                while (phones.moveToNext())
                {
                String Name=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String Number=phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}

Faites-moi savoir s'il y a un problème.

6
Maidul

Vous pouvez utiliser l'exemple "ContactManager" à partir de Android site du développeur (OR) Accédez à l'emplacement où vous avez défini le chemin pour télécharger Android-sdk sur votre système. Dans Android-sdk-mac_x86/samples/Android-10, vous pouvez voir l'exemple "ContactManager".

J'ai essayé d'utiliser cet exemple, a bien fonctionné dans mon application.

3
Ramya

Cette partie ne fonctionnerait pas pour moi:

 while (phones.moveToNext()) { 
     String phoneNumber = phones.getString( 
       phones.getColumnIndex( 
         ContactsContract.CommonDataKinds.Phone.NUMBER));                 
    } 

Si je l'utilise, cependant:

 while (phones.moveToNext()) { 
                                  String pdata = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                                  Log.v("DATA",pdata);
}
3
vanevery

J'utilise Samsung Galaxy Note 4 et je ne comprends pas pourquoi rien de ce qui précède n'a fonctionné pour moi. J'en ai confondu quelques-uns et j'ai fait ça.

    Cursor people = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
    people.moveToFirst();
    while(people.moveToNext()) {
       int nameFieldColumnIndex = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
       String contact = people.getString(nameFieldColumnIndex);
       int numberFieldColumnIndex = people.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA);
       String number = people.getString(numberFieldColumnIndex);
       dbWriter.execSQL("Insert Into ContactsList (ContactName, ContactNumber) Values (" +
                 "'" + contact.replace("'",  "''") + "', '" + number.replace("'",  "''") + "')");
    }
    people.close();
0
Sayka