Android:通过周年纪念日事件获取联系人

Posted

技术标签:

【中文标题】Android:通过周年纪念日事件获取联系人【英文标题】:Android: get contacts with anniversary date event 【发布时间】:2021-10-11 23:35:32 【问题描述】:

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

我正在做以下事情:

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,但由于某种原因,这不适用于周年纪念日。

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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我认为问题在于将光标行转换为您的自定义 Contact 类。

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

...
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

【讨论】:

你说得对,我在联系人创建过程中出错。谢谢。

以上是关于Android:通过周年纪念日事件获取联系人的主要内容,如果未能解决你的问题,请参考以下文章

HTML5抗战游戏-纪念抗日战争胜利70周年

Android - 如何从通话记录中获取联系人?

NSFetchedResultsController 和实体继承

在 Android 上通过电话号码获取联系人

Android快速获取联系人

Android:通过 IM 获取所有联系人