Obtenez l’anniversaire de chaque contact dans l’application Android

Dans mon application Android, j’ai lu tous les contacts avec le code suivant:

ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { Ssortingng id = cur.getSsortingng(cur.getColumnIndex(ContactsContract.Contacts._ID)); Ssortingng name = cur.getSsortingng(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); ContentResolver bd = getContentResolver(); Ssortingng where = Data.RAW_CONTACT_ID+" = "+id+" and "+Data.MIMETYPE+" = "+CommonDataKinds.Event.CONTENT_ITEM_TYPE; Cursor bdc = bd.query(ContactsContract.Data.CONTENT_URI, null, where, null, null); if (bdc.getCount() > 0) { while (bdc.moveToNext()) { Ssortingng birthday = bdc.getSsortingng(0); Toast.makeText(getApplicationContext(), id+name+birthday, Toast.LENGTH_SHORT); } } } } cur.close(); 

C’est ainsi que j’ai essayé de lire l’événement anniversaire pour chaque contact. Mais évidemment, cela ne fonctionne pas encore. Alors, comment puis-je lire correctement la date de naissance du contact?

Attention: certains constructeurs fournissent leur propre fournisseur de contacts (et non le standard Android) et peuvent ne pas suivre les pratiques standard d’Android. Par exemple, com.android.providers.contacts.HtcContactsProvider2 répond aux requêtes sur mon HTC Desire HD.

Voici un moyen:

 // method to get name, contact id, and birthday private Cursor getContactsBirthdays() { Uri uri = ContactsContract.Data.CONTENT_URI; Ssortingng[] projection = new Ssortingng[] { ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.CommonDataKinds.Event.CONTACT_ID, ContactsContract.CommonDataKinds.Event.START_DATE }; Ssortingng where = ContactsContract.Data.MIMETYPE + "= ? AND " + ContactsContract.CommonDataKinds.Event.TYPE + "=" + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; Ssortingng[] selectionArgs = new Ssortingng[] { ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE }; Ssortingng sortOrder = null; return managedQuery(uri, projection, where, selectionArgs, sortOrder); } // iterate through all Contact's Birthdays and print in log Cursor cursor = getContactsBirthdays(); int bDayColumn = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE); while (cursor.moveToNext()) { Ssortingng bDay = cursor.getSsortingng(bDayColumn); Log.d(TAG, "Birthday: " + bDay); } 

Si cela ne fonctionne pas, vous pouvez avoir un fournisseur de contacts modifié par OEM.

On peut lire l’anniversaire de tous les utilisateurs avec le code suivant:

 ContentResolver cr = getContentResolver(); Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cur.getCount() > 0) { while (cur.moveToNext()) { Ssortingng id = cur.getSsortingng(cur.getColumnIndex(ContactsContract.Contacts._ID)); Ssortingng name = cur.getSsortingng(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); ContentResolver bd = getContentResolver(); Cursor bdc = bd.query(android.provider.ContactsContract.Data.CONTENT_URI, new Ssortingng[] { Event.DATA }, android.provider.ContactsContract.Data.CONTACT_ID+" = "+id+" AND "+Data.MIMETYPE+" = '"+Event.CONTENT_ITEM_TYPE+"' AND "+Event.TYPE+" = "+Event.TYPE_BIRTHDAY, null, android.provider.ContactsContract.Data.DISPLAY_NAME); if (bdc.getCount() > 0) { while (bdc.moveToNext()) { Ssortingng birthday = bdc.getSsortingng(0); // now "id" is the user's unique ID, "name" is his full name and "birthday" is the date and time of his birth } } } } cur.close(); 

Mais existe-t-il un moyen meilleur ou plus court de le faire?

 ContentResolver cr = getContentResolver(); Ssortingng where = Data.raw_contacts_id + " = your_id and " + Data.MIMETYPE + " = " + CommonDataKinds.Events.CONTENT_ITEM_TYPE; cr.query(ContactsContract.Data.CONTENT_URI, null, where, null, null); 

Je n’ai pas testé le code car je n’ai pas installé SDK sur mon ordinateur. Mais je crois que ça devrait marcher.
J’espère que cela vous aidera dans certains cas.