Android: 获取与周年纪念日活动的联系人

Android: get contacts with anniversary date event

我想获取已设置周年纪念日的本地联系人列表。

我正在执行以下操作:

object WithAnniversary {
    const val INDEX_CONTACT_ID = 0
    const val INDEX_CONTACT_NAME = 1
    const val INDEX_CONTACT_ANNIVERSARY = 2
    const val INDEX_CONTACT_PHOTO = 3

    val PROJECTION = arrayOf(
        CommonDataKinds.Event.CONTACT_ID,
        ContactsContract.Contacts.DISPLAY_NAME,
        CommonDataKinds.Event.START_DATE,
        CommonDataKinds.Phone.PHOTO_URI
    )

    const val WHERE = "${ContactsContract.Data.MIMETYPE} = ? AND " +
            "${CommonDataKinds.Event.TYPE} = " +
            "${CommonDataKinds.Event.TYPE_ANNIVERSARY}"

    val SELECTION = arrayOf(CommonDataKinds.Event.CONTENT_ITEM_TYPE)

    val SORT_ORDER: String? = null
}

    @Throws(Exception::class)
    fun obtainContactsWithAnniversaries(): List<Contact> {
        val list = mutableListOf<Contact>()
        val cursor = context.contentResolver.query(
            ContactsContract.Data.CONTENT_URI,
            WithAnniversary.PROJECTION,
            WithAnniversary.WHERE,
            WithAnniversary.SELECTION,
            WithAnniversary.SORT_ORDER
        )

        if (cursor != null) {
            while (cursor.moveToNext()) {
                val id = cursor.getLong(WithAnniversary.INDEX_CONTACT_ID)
                val name = cursor.getString(WithAnniversary.INDEX_CONTACT_NAME)
                val date = cursor.getString(WithAnniversary.INDEX_CONTACT_ANNIVERSARY)
                val avatarUri = cursor.getString(WithAnniversary.INDEX_CONTACT_PHOTO)

                try {
                    val contact = contactFactory.create(id.toString(), name, null, date, avatarUri)
                    list.add(contact)
                } catch (e: Exception) {
                    Log.d(TAG, "Could not parse contact with name: $name")
                }

            }
            cursor.close()

            return list.sorted()
        } else {
            throw Exception("Unable to retrieve contacts, returned cursor is null")
        }
    }

我使用完全相同的过程来检索带有生日日期的联系人,但使用 TYPE_BIRTHDAY 而不是 TYPE_ANNIVERSARY,但由于某些原因,这不适用于周年纪念日。

我查看了本地联系人列表,我有一些生日和周年纪念日的联系人。我可以检索包含生日的联系人列表,但包含周年纪念日的联系人列表是空的。

任何帮助将不胜感激。

我认为问题出在将光标行转换为自定义 Contact class.

当我仅用日志替换该部分时,您的代码对我有效:

...
while (cursor.moveToNext()) {
    val id = cursor.getLong(WithAnniversary.INDEX_CONTACT_ID)
    val name = cursor.getString(WithAnniversary.INDEX_CONTACT_NAME)
    val date = cursor.getString(WithAnniversary.INDEX_CONTACT_ANNIVERSARY)
    val avatarUri = cursor.getString(WithAnniversary.INDEX_CONTACT_PHOTO)

    Log.d("TEMP", "contact $id $name $date $avatarUri")
}
...

日志:

D/TEMP: contact 98014 Test1 1979-10-06 content://com.android.contacts/contacts/98014/photo
    contact 4603 test 1990-07-22 content://com.android.contacts/contacts/4603/photo
    contact 98341 Voice Mail 2013-11-06 null