2011-12-20 13 views
10

En mi aplicación para Android, leí todos los contactos con el siguiente código:Obtener cumpleaños para cada contacto en la aplicación de Android

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)); 
     ContentResolver bd = getContentResolver(); 
     String 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()) { 
       String birthday = bdc.getString(0); 
       Toast.makeText(getApplicationContext(), id+name+birthday, Toast.LENGTH_SHORT); 
      } 
     } 
    } 
} 
cur.close(); 

Así es como he tratado de leer el evento de cumpleaños para cada contacto individual. Pero obviamente todavía no funciona. Entonces, ¿cómo puedo leer la fecha de nacimiento del contacto correctamente?

Respuesta

22

palabra de precaución: de algunos OEM proporcionar su propio proveedor de contacto (no el estándar de un androide) y pueden no seguir las prácticas estándar de Android. Por ejemplo, com.android.providers.contacts.HtcContactsProvider2 responde a las preguntas sobre mi HTC Desire HD

Aquí está una manera:

// method to get name, contact id, and birthday 
private Cursor getContactsBirthdays() { 
    Uri uri = ContactsContract.Data.CONTENT_URI; 

    String[] projection = new String[] { 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Event.CONTACT_ID, 
      ContactsContract.CommonDataKinds.Event.START_DATE 
    }; 

    String where = 
      ContactsContract.Data.MIMETYPE + "= ? AND " + 
      ContactsContract.CommonDataKinds.Event.TYPE + "=" + 
      ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY; 
    String[] selectionArgs = new String[] { 
     ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE 
    }; 
    String 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()) { 
    String bDay = cursor.getString(bDayColumn); 
    Log.d(TAG, "Birthday: " + bDay); 
} 

Si esto no funciona, puede que tenga un OEM modificado contactos proveedor.

+0

Gracias! También podría haber vinculado esta pregunta;) http://stackoverflow.com/questions/7376980/android-2-2-contact-birthday-date – caw

1
ContentResolver cr = getContentResolver(); 
String 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); 

No he probado el código ya que no instalé sdk en mi computadora. Pero creo que debería funcionar.
Espero que te ayude en algunos aspectos.

+1

Gracias! Agregué tu fragmento de código en mi pregunta. ¿Así es como querías que fuera? – caw

+0

¿Has probado mi fragmento? Pensé que debería funcionar –

+0

Sí, lo probé. Y desafortunadamente, no funciona (todavía). Pasa por el bucle de contactos externo pero solo una vez en el ciclo interno de cumpleaños (String birthday = bdc.getString (0)). Y el contacto para el que ingresa al ciclo interno no tiene un conjunto de cumpleaños. – caw

2

se puede leer todo el cumpleaños de los usuarios con el siguiente código:

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)); 
     ContentResolver bd = getContentResolver(); 
     Cursor bdc = bd.query(android.provider.ContactsContract.Data.CONTENT_URI, new String[] { 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()) { 
       String birthday = bdc.getString(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(); 

pero ¿hay alguna manera mejor o más corto para hacerlo?

Cuestiones relacionadas