Tutorial : Manipuler les contacts - STEP 1 : READ
Par Gregory le lundi 27 avril 2009, 16:25 - Tutorial - Lien permanent
Voir, Modifier, Supprimer des contacts ! En Ajouter des nouveaux ! En
importer dans votre application, en exporter depuis celle-ci... C'est ce que
nous allons voir ici ! Au final on obtiendra quelque chose comme ça :
Le nom, le numéro,
et la photo de chacun de vos contacts. Pour cette première partie, on
commencera par "LIRE" les contacts.
É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). 
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.

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));
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 :

La source complète du code est disponible en pièce jointe
Commentaires
bonjour,
merci pour ce tuto tres clair. mais j'ai tout de meme une petite question, comment je peux faire pour ajouter une fonction a chaque foi qu'un contact est selectionné? par exemple des qu'un des contacts est selectioné, un petit toast aparait avec son image?
Hop, alors c'est pas compliqué, il faut utiliser l'interface OnItemClickListener :
http://developer.android.com/refere...
Tu appelles simplement la méthode setOnItemClickListener sur ta listview et zou ... ça donne :
getListView().setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick (AdapterView<?> parent, View view, int position, long id) {
String item = (String) view.getItemAtPosition(position);
Toast.makeText(CatalogueActivity.this, "HOP : " + item,Toast.LENGTH_SHORT).show();
}
});
Faut faire tout ça dans ta classe ListActivity bien sûr.