android 获取联系人的两种方法

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值