首先读取联系人列表需要先申请权限
<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.ContentResolver
import android.provider.ContactsContract
object 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
}
}