TransWikia.com

Долго парсятся контакты из телефонной книги

Stack Overflow на русском Asked by tosh17 on November 27, 2021

Мне нужно получить список контактов из телефонной книги. На выходе нужны имена с телефонами и почтой

fun readPhoneBookContact(cr: ContentResolver): List<Contact> {
val order = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC"
val crContacts = cr.query(
    ContactsContract.Contacts.CONTENT_URI,
    null,null, null, order)
crContacts?.let { contacts ->
    val listContact: MutableList<Contact> = mutableListOf()
    while (contacts.moveToNext()) {
        val contact = readContact(contacts, cr)
        listContact.add(contact)
    }
    contacts.close()
    return listContact.toList()
 }
 return listOf()
}

   private fun getContactString(contact: Cursor, index: String) =
       contact.getString(contact.getColumnIndex(index))

private fun readContact(contactCursor: Cursor, cr: ContentResolver): Contact {
 val contact = Contact()

 val id = getContactString(contactCursor, ContactsContract.Contacts._ID)
 getContactString(contactCursor, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)?.let {
     contact.name = it
}

if (getContactString(contactCursor, ContactsContract.Contacts.HAS_PHONE_NUMBER).toInt() > 0) {

    cr.query(
        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                + " = ?",
        arrayOf(id),
        null
    )?.let { crPhones ->
        val setPhones = mutableSetOf<String>()
        while (crPhones.moveToNext()) {
            val phone: String = crPhones.getString(
                crPhones
                    .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
            )
             setPhones.add(phone)
        }
        crPhones.close()
        contact.phones = setPhones.toList()
    }

    cr.query(
        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
        null,
        ContactsContract.CommonDataKinds.Email.CONTACT_ID
                + " = ?",
        arrayOf(id),
        null
    )?.let { crEmails ->
        val setEmails = mutableSetOf<String>()
        while (crEmails.moveToNext()) {
            val email: String = crEmails.getString(
                crEmails
                    .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)
            )
            setEmails.add(email)
        }
        crEmails.close()
        contact.email = setEmails.toList()
    }
}
return contact

}

Все работает, но у меня на телефоне(Номеров = 861 Emails= 232), но запрос выполняется 16 секунд.
В тех же месенжарах, книга открывается за секунду.
Возможно есть более быстрый способ чем вот этот код

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP