Добавление пользовательских строк в контактную информацию, работает только с одним контактом - PullRequest
0 голосов
/ 05 июля 2019

В приложении для 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?

1 Ответ

1 голос
/ 13 июля 2019

ну, в первой строке вашей функции addContact вы в основном удаляете все другие пользовательские строки, которые когда-либо добавлялись вашим приложением (resolver.delete(RawContacts.CONTENT_URI, RawContacts.ACCOUNT_TYPE + " = ?", ...)),

Так что в основном ваш цикл продолжает удалять последнюю добавленную строкуи затем добавляя новую строку на его место несколько раз ...

Чтобы это исправить, рассмотрите возможность добавления определенного идентификатора rawContact ID к выбору вашего resolver.delete вызова.

УЛУЧШЕНИЕPERFORMANCE :

Чтобы повысить производительность вашего кода, вы можете сделать две вещи:

  1. переместить вставку в настройки из цикла, вам, вероятно, не нужно повторятьв этой строке для каждого контакта
  2. ваша функция addContact принимает ops в качестве параметра и заполняет ее только операциями в самой функции, вызывающий цикл должен продолжать проверять ops.size, а когда он увеличиваетсякакое-то число (попробуйте 100) вы запускаете applyBatch.это должно значительно уменьшить количество вызовов applyBatch, которые вы делаете, однако здесь есть кое-что хитрое, так как вам нужно будет указать правильный индекс для RAW_CONTACT_ID, так как 0 будет указывать на первый необработанный контакт, созданный во всем пакете, вынеобходимо отслеживать созданные вами исходные тексты и указывать правильный индекс.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...