【问题标题】:Adding custom rows to contact details, only works with one contact将自定义行添加到联系人详细信息,仅适用于一位联系人
【发布时间】:2019-11-15 23:57:06
【问题描述】:

在一个 android 应用程序中,我添加了一个自定义行以使用自定义 mimetype 来在特定活动上打开我的应用程序的联系人详细信息。 如果我对一个联系人执行此操作效果很好,但如果我尝试将其添加到我的所有联系人,自定义行不会出现。

我正在使用以下代码:

// TODO Adding multiple inst working
/*contacts.forEach { contact ->
    if (!contact.aliasName.isNullOrEmpty()) {
        ContactsManager.instance.addContact(context, contact)
    }
}*/

ContactsManager.addContact(context, contacts[0])

fun addContact(context: Context, contact: Contact) {
    val resolver = context.contentResolver
    resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
           ContactsContract.RawContacts.ACCOUNT_TYPE + " = ?", arrayOf(AccountGeneral.ACCOUNT_TYPE))

    val names = contact.name?.split(" ")
    Logger.e(" #### CONTACT Updated", contact.name.toString())

    var givenName = contact.name
    var familyName = ""
    if (names?.size!! > 1) {
       givenName = names[0]
       familyName = names[1]
    }

    val ops = ArrayList<ContentProviderOperation>()

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, AccountGeneral.ACCOUNT_NAME)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, AccountGeneral.ACCOUNT_TYPE)
            .build())

    ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Settings.CONTENT_URI, true))
                .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, AccountGeneral.ACCOUNT_NAME)
                .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, AccountGeneral.ACCOUNT_TYPE)
                .withValue(Settings.UNGROUPED_VISIBLE, 1)
                .build())

        ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
                .withValueBackReference(Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Contacts.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
                .withValue(StructuredName.GIVEN_NAME, givenName)
                .withValue(StructuredName.FAMILY_NAME, familyName)
                .build())

        ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Contacts.Data.RAW_CONTACT_ID, 0)
                .withValue(Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
                .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.aliasName.getFormattedPhoneNumber())
                .build())

        ops.add(ContentProviderOperation.newInsert(addCallerIsSyncAdapterParameter(Data.CONTENT_URI, true))
                .withValueBackReference(ContactsContract.Contacts.Data.RAW_CONTACT_ID, 0)
                .withValue(ContactsContract.Contacts.Data.MIMETYPE, MIMETYPE)
                .withValue(ContactsContract.Contacts.Data.DATA1, Integer.valueOf(14))
                .withValue(ContactsContract.Contacts.Data.DATA2, context.getString(R.string.transferSummaryActionSendMoney))
                .withValue(ContactsContract.Contacts.Data.DATA3, context.getString(R.string.transferSummaryActionSendMoney))
                .build())

        try {
            val results = resolver.applyBatch(ContactsContract.AUTHORITY, ops)
            if (results.isEmpty())
                return
        } catch (e: Exception) {
            e.printStackTrace()
        }

如何将自定义行添加到我的所有联系人?

我的另一个问题是,当我对所有联系人运行此代码时,它需要相当长的时间 (联系人之间的时间在初始联系人之间增加 1 秒,到结束时大约 10 秒列表)。如何将applyBatch 转换为bulkInsert

【问题讨论】:

    标签: android kotlin android-contacts android-syncadapter android-account


    【解决方案1】:

    好吧,在您的 addContact 函数的第一行,您基本上是在删除您的应用添加的所有其他自定义行 (resolver.delete(RawContacts.CONTENT_URI, RawContacts.ACCOUNT_TYPE + " = ?", ...)),

    所以基本上你的循环会不断删除添加的最后一行,然后在其位置重复添加一个新行...

    要解决此问题,请考虑将特定的 rawContact ID 添加到您的 resolver.delete 呼叫的选择中。

    提高性能

    要提高代码的性能,您可以做两件事:

    1. 将插入移出循环设置,您可能不需要为每个联系人重复该行
    2. 让你的addContact 函数接受ops 作为参数,并且只用函数本身的操作填充它,调用循环应该继续检查 ops.size 并且当它增加到某个数字(尝试 100)时,你运行applyBatch。这应该会显着减少您正在执行的 applyBatch 调用的数量,但是,这里有一些棘手的问题,因为您需要为 RAW_CONTACT_ID 指定正确的索引,因为 0 将指向整个批次中创建的第一个原始联系人,您需要跟踪您创建的原始数据,并指定正确的索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-08
      相关资源
      最近更新 更多