ÉTAPE 1 : Récupérer les informations du contact...
...Et les afficher !

On utilisera donc pour cette première étape une simple liste qui affichera du texte a chaque item. Le nom et numéro de chaque contacts seront stockés dans une String. Le tableau contenant tout ce petit monde s'appelle donc contacts :

  • private ArrayList<String> contacts;
  • setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, contacts));

Lorsqu'on récupérera les contacts, on voudra le nom et le numéro (pour l'instant). code0

ContentResolver resolver = this.getContentResolver(); crée une instance de ce qui permet d'accèder au contenu d'autres application.

Uri uri = Contacts.People.CONTENT_URI; récupère l'URI où se trouvent vos contacts (on aurai aussi pu faire un parse de la string “content://contacts/people/”

String projection = new String {People.NAME, People.NUMBER }; est un tableau qui permettra de ne demander que les informations des colonnes indiquée. Cela permet d'éviter une requête trop importante.

Cursor cur = resolver.query(uri, projection, null, null, null); un Cursor correspond au résultat d'une requête sur base de donnée. Ici on récupère le résultat d ela requête sur l'uri des contact, avec comme seule colonnes demandée celles indiquée par projection. Les arguments supplémentaire placés ici à null permettent de faire l'équivalent des WHERE clause et ORDER BY des requêtes SQL classiques.

this.startManagingCursor(cur); est votre ami. Il s'occupe de fermer et rouvrir le curseur pour vous en fonction de l'état de votre Activity.

screen0

On à ici une liste basique, mais somme toute assez peu attrayante. Afin de pouvoir Afficher plus d'informations, vous devrez peu à peu vous diriger vers la solution d'utiliser votre propre adapteur, et votre propre layout générique.

ÉTAPE 2 : Récupérer plus d'information ! et les afficher mieux ;)

On crée donc notre propre layout : contact.xml, et notre propre adapteur : MyAdapter. On en profite pour créer notre propre classe de Contact pour y insérer/récupérer les données que l'on veux. Le changement de code de la classe principal est donc minime. setListAdapter(new MyAdapter(this, contacts)); remplace la ligne précédante. Et dans notre fonciton getContacts on change aussi l'ajout dans le tableau par : contacts.add(new Contact(name, num));

screen1 Le résultat est déjà un peu plus sympathique, et vous voyez déjà l'emplacement pour la prochaine partie : La photo !

ETAPE 3 : La photo C'est en réalité d'une simplicité déconcertante :

  • D'abord on récupère l'uri du contact concerné.
  • Puis on récupère simplement sa photo via : Bitmap img = People.loadContactPhoto(this, uri, R.drawable.icon, null);

Cette fois ci on utilisera l'autre méthode pour composer l'uri :

String id = cur.getString(cur.getColumnIndex(Contacts.People._ID)); uri = Uri.parse("content://contacts/people/" + id);

Il suffit ensuite d'ajouter cette photo dans votre objet Contact, puis de le faire afficher dans l'adapter :

screen2

La source complète du code est disponible en pièce jointe