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:通过周年纪念日事件获取联系人的主要内容,如果未能解决你的问题,请参考以下文章