Исправьте данные для вставки контактов программно - PullRequest
0 голосов
/ 04 декабря 2018

Я написал следующие методы для программного создания контактов в моем приложении

override fun addContactToPhone() {
    val ops = ArrayList<ContentProviderOperation>()
    val rawContactId = ops.size

    try {
        ops.add(
            ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
                .withValue(RawContacts.ACCOUNT_TYPE, null)
                .withValue(RawContacts.ACCOUNT_NAME, null)
                .build()
        )
    } catch (e: Exception) {
        Log.e("Add", "could not find account_type null")
        return
    }

    addContactNameInfo(ops, rawContactId)
    addContactEmailInfo(ops, rawContactId)
    addContactInfo(ops, rawContactId)
}

private fun addContactInfo(
    ops: ArrayList<ContentProviderOperation>,
    rawContactId: Int
) {
    ops.add(
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
            withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
            withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, sPhoneNr)
            withValue(
                ContactsContract.CommonDataKinds.Phone.TYPE,
                ContactsContract.CommonDataKinds.Phone.TYPE_WORK
            )
        }.build()
    )
}

private fun addContactEmailInfo(
    ops: ArrayList<ContentProviderOperation>,
    rawContactId: Int
) {
    ops.add(
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
            withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
            withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            withValue(ContactsContract.CommonDataKinds.Email.DATA, sEmail)
        }.build()
    )
}

private fun addContactNameInfo(
    ops: ArrayList<ContentProviderOperation>,
    rawContactId: Int
) {
    ops.add(
        ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI).apply {
            withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactId)
            withValue(
                ContactsContract.Data.MIMETYPE,
                ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
            )
            // Name of the person
            withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, sLastname)
            withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, sFirstname)
            withValue(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, sMiddleName)
        }.build()
    )
}

И у меня есть несколько вопросов над правильными данными, которые я должен использовать с поставщиком контактов:

  1. Как получить переменную contactRawId?Верна ли моя идея?
  2. В каком формате я должен отправить телефон?Если у меня есть телефонная строка типа «+7 (960) 001-02-03» или «+34 (960) 001-02-03», какие символы я должен из нее вырезать?
  3. Нужно лиукажите DISPLAY_NAME, или он будет автоматически сформирован из FAMILY_NAME, MIDDLE_NAME, GIVEN_NAME

Благодарим Вас за помощь

1 Ответ

0 голосов
/ 05 декабря 2018
  1. не передавайте rawContactId вашим методам, вместо этого просто введите 0, как в: withValueBackReference(Data.RAW_CONTACT_ID, 0) часть «ValueBackReference» означает «использовать идентификатор, полученный при первой операции вставки в этом спискеоперации.
  2. В Phone.NUMBER вы можете поместить телефон в любой формат, который вам нужен, БД контактов будет хранить строго отформатированный (E164) номер телефона под Phone.NORMALIZED_NUMBER автоматически
  3. Я думаю, что этохорошо, вы обычно должны предоставить либо DISPLAY_NAME, либо имя части
...