В приложении для Android я добавил пользовательскую строку для контактной информации с пользовательским mimetype
, чтобы открыть свое приложение для определенного действия.Это хорошо работает, если я сделаю это для одного контакта, но если я попытаюсь добавить его к всем моим контактам, пользовательская строка не появится.
IИспользую следующий код:
// 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
?