繁体   English   中英

在Android中更新联系人电话号码列表的正确方法是什么?

[英]What is the correct way to update a list of contact phone numbers in Android?

我想创建一种更新联系人的方法,包括其名称(结构化)和电话号码列表。

结构名称部分没有任何问题,但是我不确定联系电话号码列表。 它表示为字符串列表。 这是我目前所拥有的:

val phonesSelection = "${ContactsContract.CommonDataKinds.Phone.CONTACT_ID}=? AND ${ContactsContract.Data.MIMETYPE}=?"
            val phoneArgs = arrayOf(
                entity.phoneContactId.toNotNullable().toString(),
                ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
            )

            val phoneUpdateOperationProvider = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
                .withSelection(phonesSelection, phoneArgs)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, entity.phones)
                .build()

            try {
                contentResolver.applyBatch(
                    ContactsContract.AUTHORITY,
                    arrayListOf(
                        nameUpdateOperationProvider,
                        phoneUpdateOperationProvider
                    )
                )
            } catch (ex: Exception) {}

保存联系人列表的这种方法是否正确,还是有另一种方法?

Phone.NUMBER接受一个字符串,您不能将其设置为电话号码列表,而是每个电话需要一个单独的Data条目。

另外,假设您要修改的联系人已经有一个可以修改的电话号码,不一定是这样,我假设entity.phones.size与当前存储的电话号码不同联系人,您需要根据需要删除/插入。

另外,还在选择Phone.CONTACT_ID}=?上运行更新Phone.CONTACT_ID}=? 会将所有手机更新为相同的值,这不是您想要执行的操作。

如果要完成将现有电话替换为新电话的操作,建议删除所有现有电话,然后添加所有新电话。

另一个问题是,联系人的所有数据都存储在特定的RawContact上,这是由某些服务应用程序同步的联系人的一部分,例如,一个联系人可以有2个RawContacts,一个从Google同步,另一个从Yahoo同步。 。 您需要确定要存储手机列表的RawContact,它可以在该联系人已经存在的某些现有RawContact上,也可以在为您的应用创建的新RawContact上。

val rawContact = // find the RawContact in which you want to insert your phones!!

val ops = arrayListOf(nameUpdateOperationProvider)

val phonesSelection = "${ContactsContract.CommonDataKinds.Phone.CONTACT_ID}=?"
val phoneArgs = arrayOf(entity.phoneContactId.toNotNullable().toString())

// note we're running on Phone.CONTENT_URI, so no need to limit MIMTETYPE
val phonesDelete = ContentProviderOperation.newDelete(ContactsContract.Phone.CONTENT_URI) 
    .withSelection(phonesSelection, phoneArgs)
    .build()
ops.add(phonesDelete)

entity.phones.forEach {
    val addPhone = ContentProviderOperation.newInsert(ContactsContract.Phone.CONTENT_URI)
    .withValue(Phone.RAW_CONTACT_ID, rawContact)
    .withValue(Phone.NUMBER, it)
    .build()
    ops.add(addPhone)
}

try {
    contentResolver.applyBatch(ContactsContract.AUTHORITY, ops)
} catch (ex: Exception) {}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM