在一个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
?
答案 0 :(得分:1)
好吧,在addContact
函数的第一行上,您基本上是在删除应用曾经添加的所有其他自定义行(resolver.delete(RawContacts.CONTENT_URI, RawContacts.ACCOUNT_TYPE + " = ?", ...)
)
因此,基本上,您的循环会不断删除最后添加的行,然后反复在其位置添加新行...
要解决此问题,请考虑将特定的rawContact ID添加到您选择的resolver.delete
呼叫中。
改进性能:
要提高代码的性能,您可以做两件事:
addContact
函数接受ops
作为参数,并仅在函数本身中填充操作,调用循环应继续检查ops.size,当它增加到一定数量时(尝试100)您运行applyBatch
。这会大大减少您正在执行的applyBatch调用的次数,但是,这里有些棘手的事情,因为您需要为RAW_CONTACT_ID指定正确的索引,因为0指向整个批次中创建的第一个原始联系人,需要跟踪您创建的原始数据,并指定正确的索引。