首先读取联系人列表需要先申请权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
Android 读取联系人列表需要通过 ContentResolver 来操作,具体如下:
// 需要读取的数据列,不设置的话就查询所有数据列val projections = arrayOf( ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER)val cursor = contentResolver.query( // 查询 phone 相关数据,可根据实际需要替换 ContactsContract.CommonDataKinds.Phone.CONTENT_URI, // 查询列 projections, // 查询条件 // 查询具体 CONTACT_ID 的联系人信息,示例:ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?", null, // 查询条件相关的查询参数 // 示例:arrayOf(contactId) null, // 排序条件,示例 "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME} ASC" // ASC 升序,DESC 降序 null)cursor?.let { val contactIdIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID) val displayNameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) val numberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) while (it.moveToNext()) { val contractId = it.getString(contactIdIndex) val displayName = it.getString(displayNameIndex) val number = it.getString(numberIndex) val email = fetchEmail(contentResolver, contractId) } // close 勿忘 it.close()}
查询联系人姓名、电话、邮箱完整示例如下:
data class ContactBean( var name: String?, var phone: String?, var email:String?)
import android.content.ContentResolverimport android.provider.ContactsContractobject ContactUtils { fun fetchContacts(contentResolver: ContentResolver): List<ContactBean> { val contracts = arrayListOf<ContactBean>() val projections = arrayOf( ContactsContract.CommonDataKinds.Phone.CONTACT_ID, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER ) val cursor = contentResolver.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projections, null, null, "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME} ASC" ) cursor?.let { val contactIdIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID) val displayNameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME) val numberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER) while (it.moveToNext()) { val contractId = it.getString(contactIdIndex) val displayName = it.getString(displayNameIndex) val number = it.getString(numberIndex) val email = fetchEmail(contentResolver, contractId) contracts.add(ContactBean(displayName, number, email)) } it.close() } return contracts } /** * 获取指定联系人的邮箱地址 */ private fun fetchEmail(contentResolver: ContentResolver, contactId: String): String { var tempEmail = "" val projections = arrayOf( ContactsContract.CommonDataKinds.Email.ADDRESS ) val cursor = contentResolver.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, projections, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?", arrayOf(contactId), null ) cursor?.let { // 此处只获取一个邮箱地址,可根据需要修改 if (it.moveToNext()) { tempEmail = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS)) } it.close() } return tempEmail }}