object PhoneContactUtils {
private const val SORT_KEY = ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY
private var generator: ICombinationDataGenerator? = null
init {
generator = OServiceManager.getOneImplInstance(ICombinationDataGenerator::class.java)
}
fun getAllContacts(context: Context): List<PhoneContact> {
val phones = ArrayList<PhoneContact>()
val cursor = context.contentResolver.query(
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null, SORT_KEY
)
while (cursor.moveToNext()) {
// 获取一个联系人实例
val contactId = cursor.getString(
cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID)
)
// 获取联系人名字
val name = cursor.getString(
cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)
)
val phoneCursor = context.contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactId,
null,
null
)
while (phoneCursor.moveToNext()) {
var phone =
phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))
phone?.also {
phone = phone.replace("-", "")
phone = phone.replace(" ", "")
phones.add(
PhoneContact(
phone,
name ?: ""
)
)
}
}
phoneCursor.close()
}
cursor?.close()
return phones
}
private val PHONES_PROJECTION = arrayOf(
Phone.NUMBER, Phone.DISPLAY_NAME, Phone.CONTACT_ID
)
fun getAllContacts(context: Context): List<PhoneContact> {
val phones = ArrayList<PhoneContact>()
val cursor = context.contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PHONES_PROJECTION,
null,
null, SORT_KEY
)
if (cursor != null) {
while (cursor.moveToNext()) {
phones.add(
PhoneContact(
cursor.getString(0) ?: "",
cursor.getString(1) ?: ""
)
)
}
cursor.close()
}
return phones
}
}
https://blog.csdn.net/qq569699973/article/details/51802481
最快速读取手机通讯录中联系人信息
两种方法都是获取通讯录且可用,但是两者的速度却是差距很大,亲测130+联系人读取遍历到显示---方法一耗时:5秒、方法二耗时:42毫秒
分析:第一个方法一的用了多个游标 方法体内的方法繁琐,
第二个方法相对简单多,只使用了一个游标就完成,
原因:有两个一个是游标 一个是Uri,两个方法用的Uri是不同的,而且第一个方法读取联系人时游标的count是错误的
contactscontract.contacts.content_uri和phone.content_uri的区别
管理联系人的Uri
ContactsContract.Contacts.CONTENT_URI
管理联系人电话的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI