在Android应用程序中获取每个联系人的生日

在我的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(); 

这是我试图读出每个联系人的生日事件。 但显然它还没有工作。 那么如何正确读出联系人的出生date

  • 在Android中将时间戳转换为当前date
  • 在android上基于用户语言环境的date格式
  • Android中的Date应该使用什么类?
  • 24小时不能在dateformat android工作
  • Android:date格式在一个string
  • 得到几毫秒直到午夜
  • 为什么java.text.DateFormat在Android上为en_US和en_GB返回相同的date格式?
  • configurationGson使用多种date格式
  • 谨慎的说法:一些OEM提供他们自己的联系人提供者(不是标准的Android联系人),并且可能不遵循标准的Android实践。 例如,com.android.providers.contacts.HtcContactsProvider2响应我的HTC Desire HD上的查询

    这是一个方法:

     // 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); } 

    如果这不起作用,您可能有OEM修改的联系人提供程序。

    用下面的代码可以读出所有用户的生日:

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

    但是有没有更好或更短的方法来做到这一点?

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

    我没有testing代码,因为我没有在我的电脑中安装sdk。 但我相信它应该工作。
    希望它会帮助你在一些aspacts。