首先读取联系人列表需要先申请权限

  1. <uses-permission android:name="android.permission.READ_CONTACTS" />

Android 读取联系人列表需要通过 ContentResolver 来操作,具体如下:

  1. // 需要读取的数据列,不设置的话就查询所有数据列
  2. val projections = arrayOf(
  3. ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
  4. ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
  5. ContactsContract.CommonDataKinds.Phone.NUMBER
  6. )
  7. val cursor = contentResolver.query(
  8. // 查询 phone 相关数据,可根据实际需要替换
  9. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  10. // 查询列
  11. projections,
  12. // 查询条件
  13. // 查询具体 CONTACT_ID 的联系人信息,示例:ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
  14. null,
  15. // 查询条件相关的查询参数
  16. // 示例:arrayOf(contactId)
  17. null,
  18. // 排序条件,示例 "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME} ASC"
  19. // ASC 升序,DESC 降序
  20. null
  21. )
  22. cursor?.let {
  23. val contactIdIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)
  24. val displayNameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
  25. val numberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
  26. while (it.moveToNext()) {
  27. val contractId = it.getString(contactIdIndex)
  28. val displayName = it.getString(displayNameIndex)
  29. val number = it.getString(numberIndex)
  30. val email = fetchEmail(contentResolver, contractId)
  31. }
  32. // close 勿忘
  33. it.close()
  34. }

查询联系人姓名、电话、邮箱完整示例如下:

  1. data class ContactBean(
  2. var name: String?,
  3. var phone: String?,
  4. var email:String?
  5. )
  1. import android.content.ContentResolver
  2. import android.provider.ContactsContract
  3. object ContactUtils {
  4. fun fetchContacts(contentResolver: ContentResolver): List<ContactBean> {
  5. val contracts = arrayListOf<ContactBean>()
  6. val projections = arrayOf(
  7. ContactsContract.CommonDataKinds.Phone.CONTACT_ID,
  8. ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
  9. ContactsContract.CommonDataKinds.Phone.NUMBER
  10. )
  11. val cursor = contentResolver.query(
  12. ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
  13. projections,
  14. null,
  15. null,
  16. "${ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME} ASC"
  17. )
  18. cursor?.let {
  19. val contactIdIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)
  20. val displayNameIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
  21. val numberIndex = it.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
  22. while (it.moveToNext()) {
  23. val contractId = it.getString(contactIdIndex)
  24. val displayName = it.getString(displayNameIndex)
  25. val number = it.getString(numberIndex)
  26. val email = fetchEmail(contentResolver, contractId)
  27. contracts.add(ContactBean(displayName, number, email))
  28. }
  29. it.close()
  30. }
  31. return contracts
  32. }
  33. /**
  34. * 获取指定联系人的邮箱地址
  35. */
  36. private fun fetchEmail(contentResolver: ContentResolver, contactId: String): String {
  37. var tempEmail = ""
  38. val projections = arrayOf(
  39. ContactsContract.CommonDataKinds.Email.ADDRESS
  40. )
  41. val cursor = contentResolver.query(
  42. ContactsContract.CommonDataKinds.Email.CONTENT_URI,
  43. projections,
  44. ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?",
  45. arrayOf(contactId),
  46. null
  47. )
  48. cursor?.let {
  49. // 此处只获取一个邮箱地址,可根据需要修改
  50. if (it.moveToNext()) {
  51. tempEmail = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS))
  52. }
  53. it.close()
  54. }
  55. return tempEmail
  56. }
  57. }