2011-12-20 24 views
10

Trong ứng dụng Android của tôi, tôi đọc ra tất cả các điểm tiếp xúc với đoạn mã sau:Get sinh nhật cho mỗi số liên lạc trong ứng dụng 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(); 

Đây là cách tôi đã cố gắng để đọc ra sự kiện sinh nhật cho tất cả các liên lạc duy nhất. Nhưng rõ ràng là nó vẫn chưa hoạt động. Vậy làm cách nào để tôi có thể đọc chính xác ngày sinh của người liên hệ?

Trả lời

22

Lời cảnh báo: một số OEM cung cấp nhà cung cấp liên hệ của riêng họ (không phải là nhà cung cấp Android chuẩn) và có thể không tuân theo các thực hành Android chuẩn. Ví dụ, com.android.providers.contacts.HtcContactsProvider2 đáp ứng các truy vấn trên HTC Desire HD của tôi

Dưới đây là một cách:

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

Nếu điều này không làm việc, bạn có thể có một OEM sửa đổi địa chỉ liên lạc các nhà cung cấp.

+0

Cảm ơn! Bạn cũng có thể đã liên kết câu hỏi này;) 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); 

Tôi chưa kiểm tra mã vì tôi chưa cài đặt sdk trong máy tính của mình. Nhưng tôi tin rằng nó sẽ hoạt động.
Hy vọng nó sẽ giúp bạn trong một số nguyện vọng.

+1

Cảm ơn! Tôi đã thêm đoạn mã của bạn làm mã trong câu hỏi của tôi. Đây có phải là cách bạn muốn nói không? – caw

+0

Bạn đã thử đoạn trích của tôi chưa? Tôi nghĩ nó sẽ hoạt động. –

+0

Vâng, tôi đã thử. Và thật không may, nó không hoạt động (chưa). Nó đi qua vòng lặp liên lạc bên ngoài nhưng chỉ một lần vào vòng lặp sinh nhật bên trong (String birthday = bdc.getString (0)). Và số liên lạc mà người đó vào vòng lặp bên trong không có bộ sinh nhật. – caw

2

Người ta có thể đọc ra tất cả sinh nhật của người sử dụng với đoạn mã sau:

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

Nhưng là có cách nào tốt hơn hoặc ngắn hơn để làm điều đó?

Các vấn đề liên quan