ContactsContract.CommonDataKinds.Event.START_DATE includes contact phone number

Viewed 129

I retrieve all events of contacts with the code below:

Uri uri = ContactsContract.Data.CONTENT_URI;
ContentResolver cr = context.getContentResolver();
String[] projection = new String[]{
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Event.CONTACT_ID,
            ContactsContract.CommonDataKinds.Event.START_DATE,
            ContactsContract.CommonDataKinds.Event.TYPE,
            ContactsContract.CommonDataKinds.Event.DATA3};

String where = ContactsContract.Data.MIMETYPE + "= ? AND "
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY + " OR "
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_OTHER + " OR "
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_CUSTOM;
String[] selectionArgs = new String[] 
{ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};

The problem is that contacts' phone numbers are listed as Event.START_DATE and with TYPE_OTHER.

Is there any way to exclude them and get only the real events?

2 Answers

I think you should add clarifying parentheses to your where clause, as it now may include rows with non-Event mimetypes (such as CommonDataKinds.Phone) as long as they have TYPE = CUSTOM.

Try this:

String where = Data.MIMETYPE + "= ? AND "
            + "("
            + Event.TYPE + "="
            + Event.TYPE_ANNIVERSARY + " OR "
            + Event.TYPE + "="
            + Event.TYPE_OTHER + " OR "
            + Event.TYPE + "="
            + Event.TYPE_CUSTOM
            + ")";
String[] selectionArgs = new String[] 
{Event.CONTENT_ITEM_TYPE};
private ArrayList<String> getEventday(String contactId) {
    String eventday = null;
    ArrayList<String> eventlist = new ArrayList<String>();
    ContentResolver cr = getContentResolver();
    Uri uri = ContactsContract.Data.CONTENT_URI;
    String[] projection = new String[]{
            ContactsContract.Contacts.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Event.CONTACT_ID,
            ContactsContract.CommonDataKinds.Event.START_DATE,
            ContactsContract.CommonDataKinds.Event.TYPE,
            ContactsContract.CommonDataKinds.Event.DATA3};
    String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND "
            + ContactsContract.Data.MIMETYPE + " = ? AND"
            + "("
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY + " OR "
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY + " OR "
            + ContactsContract.CommonDataKinds.Event.TYPE + "="
            + ContactsContract.CommonDataKinds.Event.TYPE_OTHER
            + ")";


    String[] selectionArgs = new String[]
            {contactId,ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE};

    String sortOrder = null;
    Cursor pCur = cr.query(uri, projection, orgWhere, selectionArgs, sortOrder);
    while (pCur.moveToNext()) {

        String eventytype = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.TYPE));
        eventday = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Event.START_DATE));



        ContactAddPhoneBook contactAddPhoneBook=new ContactAddPhoneBook();
        String typeEvent=contactAddPhoneBook.getContentTypeCustomerlistEventtype(Integer.parseInt(eventytype));

        eventlist.add("(" + typeEvent + ")" + ":" +eventday);
    }
    pCur.close();
    return eventlist;
}
Related