android获取联系人信息吗,Android获取联系人信息

66b52468c121889b900d4956032f1009.png

8种机械键盘轴体对比

本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

问题

Android如何获取通讯录中联系人的信息?

相关知识ContactsContract

ContentResolver

动态权限申请

一点SQL语法基础

正文

在Android中获取通讯录联系人信息其实比较简单,只要通过ContentResolver来查询相关URI的数据库表就可以了。

三张表

Android 将我们的联系人信息存储在三张表中,

因为Android系统中,可以登录多个帐户进行通讯录同步,所以一个联系人可能来自不同的帐号中,所以需要ContactsContract.RawContacts表记录,联系人信息中,那哪些信息来自哪个帐户,该记录什么时候进行的同步,同步下来后,是否发生过修改等信息,这些信息我们一般不需要关注。

三张表的关系

这三张表的关系用ER图表示:

5af55a5ec168a.png

了解了这个三个表的关系之后,获取所有联系人的信息的思路就明确了。

实际上,就是做这三个表的级联查询。

CommonDataKinds

除了上面三张表之外,这里还要了解一下ContactsContract.CommonDataKinds。

上文中三张表分别封装为对应的三个类,而CommonDataKinds封装的是这几个表中的某些列的别名。比如Data表中,数据存放在DATA1,DATA2,…, DATA15这几个列中,而CommonDataKinds.PHONE.NUMBER,实际就是指向了DATA1.

它存在的意义在于方便我们进行信息的提取。

代码添加相关权限

注: 该权限为危险,Android6.0以上需要进行动态申请

代码//kotlin

//获取所有联系人名字和Id

public fun getAllContacts(contentResolver: ContentResolver): List?{

val col = arrayOf(ContactsContract.Contacts._ID,

ContactsContract.Contacts.DISPLAY_NAME_PRIMARY)

val cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,

col, null, null, null)

if (cursor != null){

while (cursor.moveToNext()){

val id = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID))

val name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY))

Log.d(TAG, "nID = "+id+" name = "+name)

getRawContacts(contentResolver, id)

Log.d(TAG, "n----------------------------------------------")

}

cursor.close()

}

return null

}

//获取该联系人所有元数据

public fun getRawContacts(contentResolver: ContentResolver, contactId: Int){

val col = arrayOf(ContactsContract.RawContacts._ID,

ContactsContract.RawContacts.CONTACT_ID,

ContactsContract.RawContacts.ACCOUNT_NAME)

val cursor = contentResolver.query(ContactsContract.RawContacts.CONTENT_URI,

col, ContactsContract.RawContacts.CONTACT_ID+" = ?",

arrayOf(contactId.toString()), null)

if(cursor != null){

while (cursor.moveToNext()){

val id = cursor.getInt(cursor.getColumnIndex(col[0]))

val contact_id = cursor.getInt(cursor.getColumnIndex(col[1]))

val accountName = cursor.getInt(cursor.getColumnIndex(col[2]))

Log.d(TAG, "nID = "+id+" contactId = "+contact_id+" accountName = "+accountName)

getContactData(contentResolver, id)

}

cursor.close()

}

}

//获取该元数据对应用的数据

public fun getContactData(contentResolver: ContentResolver, rawContactId: Int){

val col = arrayOf(ContactsContract.Data._ID,

ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,

ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER)

val cursor = contentResolver.query(ContactsContract.Data.CONTENT_URI,

null, ContactsContract.Data.RAW_CONTACT_ID+" = ?",

arrayOf(rawContactId.toString()), null)

if(cursor != null){

while (cursor.moveToNext()){

val id = cursor.getInt(cursor.getColumnIndex(col[0]))

val name = cursor.getString(cursor.getColumnIndex(col[1]))

val number = cursor.getString(cursor.getColumnIndex(col[2]))

Log.d(TAG, "nDataId = "+id+" name = "+name+" number = "+number)

}

cursor.close()

}

}

除此之外,google还提供给 ContactsContract.Contacts.Entity,方便我们通过联系人Id查询对应的信息实体,避免多次查询表,然而我试了一下,在我的机器上没有成功。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值