【问题标题】:What is the correct way to update a list of contact phone numbers in Android?在 Android 中更新联系人电话号码列表的正确方法是什么?
【发布时间】:2019-07-21 00:39:03
【问题描述】:

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

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

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) {}

这种保存联系人列表的方式是否正确,还是有其他方式?

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

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

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

    此外,对选择 Phone.CONTACT_ID}=? 运行更新会将所有手机更新为相同的值,这不是您想要做的。

    如果您想将现有电话完全替换为新电话,我建议您删除所有现有电话,然后添加所有新电话。

    另一个问题是联系人的所有数据都存储在特定的 RawContact 上,这是由某些服务应用程序同步的联系人的一部分,例如,单个联系人可以有 2 个 RawContact,一个从 Google 同步,而其他来自雅虎。 您需要决定要存储电话列表的 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) {}
    

    【讨论】:

      猜你喜欢
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 2020-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      相关资源
      最近更新 更多