2011-12-20 54 views
10

每个联系人在我的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(); 

这是我试图读出每一个接触的生日活动。但显然它还没有工作。那么如何正确读出联系人的出生日期?

回答

22

字谨慎:一些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修改联系人供应商。

+0

谢谢!你也可以链接这个问题;)http://stackoverflow.com/questions/7376980/android-2-2-contact-birthdaydate – caw 2011-12-30 01:30:32

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

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

+1

谢谢!我添加了您的代码段,在我的问题中执行代码。这是你的意思吗? – caw 2011-12-24 03:06:34

+0

你有没有试过我的代码片段?我认为它应该工作。 – 2011-12-24 11:45:45

+0

是的,我试过了。不幸的是,它不工作(还)。它经历外部联系循环,但只有一次进入生日内部循环(String birthday = bdc.getString(0))。并且进入内部循环的联系人没有生日设置。 – caw 2011-12-25 02:58:48

2

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

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

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

相关问题