Пользовательские контакты Android ListView с именем и адресом электронной почты - PullRequest
0 голосов
/ 04 апреля 2019

Я хотел бы создать собственный ListView информации из контактов в Android.

Макет документации для Android - очень простой пример: https://developer.android.com/training/contacts-provider/retrieve-names#Permissions

Он берет отображаемое имя из ваших контактов и показывает его в виде списка. Проекция, заданная для CursorLoader:

private val PROJECTION: Array<out String> = arrayOf(
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts.DISPLAY_NAME
)

Затем отобразите на простой курсор:

private val FROM_COLUMNS: Array<String> = arrayOf(
    ContactsContract.Contacts.DISPLAY_NAME
)

Я также хотел бы добавить адрес электронной почты в просмотр списка. Возможно ли это с помощью SimpleCursorAdapter, который используется в документации?

Я также пытался изменить проекцию, чтобы проецировать адрес электронной почты:

private val PROJECTION: Array<out String> = arrayOf(
    ContactsContract.Contacts._ID,
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.CommonDataKinds.Email.DISPLAY_NAME
)

Однако, когда я это делаю, я получаю исключение:

java.lang.IllegalArgumentException: неверные данные столбца4

Я понимаю, что сопоставление контактов с электронной почтой (ями) - один ко многим. Это моя проблема? Могу ли я спроектировать «Основной» адрес электронной почты?

1 Ответ

0 голосов
/ 04 апреля 2019

Я не знаю, может ли SimpleCursorAdapter сделать это, поскольку я не использовал его, поэтому позвольте мне рассказать вам, как адреса электронной почты можно загрузить простым запросом.

IДля загрузки электронной почты и телефонных номеров использовался следующий метод, поэтому код может быть не оптимальным.

Прежде всего, адреса электронной почты хранятся в общем формате ContactsContract.Data.DATA1столбец данных, но этот же столбец может также использоваться для других типов данных (например, для телефонных номеров).Вот почему я использовал следующую проекцию:

private val PROJECTION =
    arrayOf(
        ContactsContract.Data.CONTACT_ID,
        ContactsContract.Data.DISPLAY_NAME_PRIMARY,
        ContactsContract.Data.DATA1,
        ContactsContract.Data.MIMETYPE
    )

А затем я запросил ее, как показано ниже, и обработал данные по очереди, каждый раз проверяя тип data1 MIME:

contentResolver.query(
    ContactsContract.Data.CONTENT_URI,
    PROJECTION,
    null,
    null,
    null
)?.use { cursor ->
    val idxId = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID)
    val idxDisplayNamePrimary = cursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME_PRIMARY)
    val idxData1 = cursor.getColumnIndex(ContactsContract.Data.DATA1)
    val idxMimeType = cursor.getColumnIndex(ContactsContract.Data.MIMETYPE)

    while (cursor.moveToNext()) {
        val id = cursor.getLong(idxId)
        val name: String? = cursor.getString(idxDisplayNamePrimary)
        val data1: String? = cursor.getString(idxData1)
        val mimeType: String? = cursor.getString(idxMimeType)

        if (mimeType == ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) {
            // e-mail was found and loaded into data1 - do something with it here
        }
    }
}

Я уверен, что, возможно, есть лучший способ.

Обновление # 1

Некоторые документы здесь:

Обновление # 2

Как видно из документов или кода, ContactsContract.CommonDataKinds.Email.ADDRESS балловв столбец ContactsContract.Data.DATA1.

...