Android content provider 获取手机联系人

说说Android联系人信息的组织结构及读取

这是Android给出的联系人组织结构图。分为三层。

第一层,Contact,即ContactContract.Contacts,是整合的联系人信息。

第二层,RawConact,即ContactContract.RawContact,记录的是该联系人来自某信息源的信息,例如本地输入的,来自Google的,从微软Exchange中导出的,或则来自某个社交网站的信息。每个RawContact记录的信息都来自同一信息源。

第三层,Data,即ContactContract.Data,是具体的信息存储,例如记录联系人姓名,email信息,家庭电话,手机电话信息等等,每一个Data都存放一个具体的信息。在Data中的MIME TYPE说明存储信息的类型。具体在ContactContract.CommonDataKinds中定义。每个Data中有DATA1-DATA15个字段来存储信息,各字段所代表的含义,也可以在CommonDataKinds中具体查到。

下面,我们一层一层地读取联系人信息,将更清晰地看到这个结构。要读取详细信息,对于Content Privider,关键是Uri逐层定位,才能获取信息。为了清晰表述,我们将整个路径写出来。

第一层信息,将返回联系人列表中的多个Contacts,Uri为ContactsContract.Contacts.CONTENT_URI

private String[] INFO_1= new String[]{ 
    ContactsContract.Contacts._ID,//这是每个row,也就是每个联系人的唯一的ID标识
    ContactsContract.Contacts.DISPLAY_NAME, 
}; 
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,INFO_1,null,null,null);

cursor是表格形式,每一个行表示一个联系人。要读取哪些列,在第二个参数String[]中定义。可以选取那些列,在Android Reference中的ContactsContract.Contacts中的Column中可以查到。最关键的列信息为_ID,它是行,也就是每个联系人的唯一标识。除此之外,每个联系人的信息会根据旗下的RawContact进行整合,因此,我们可以查到联系的名字ContactsContract.Contacts.DISPLAY_NAME等。

利用Contacts._ID,我们可以检索第二层的信息。

第二层信息,将返回某联系人的多个RawContacts

同样,返回表格中的列,可以查看ContactsContract.RawContacts中查看。我们选取下面的信息,此外,如果要查看信息的来源,例如来自com.google,可通过RawContacts.ACCOUNT_TYPE和RawContacts.ACCOUNT_NAME两个列查看。

private String[ ] INFO_2 = { 
    ContactsContract.RawContacts._ID, //这是RawContact的唯一标识 
    ContactsContract.RawContacts.CONTACT_ID, //这是该RawContact关联的Contact._ID
};

通过查询全部的RawContacts,通过条件检索,要求联系人的ID为指定的某联系人。在下面的例子在managedQuery中给出了param3和param4的条件,注意参数3,如果我们有多个条件,可以用AND等逻辑符合进行表述。

Cursor cursor = managedQuery(ContactsContract.RawContacts.CONTENT_URI , 
                                                     INFO_2 , 
                                          RawContacts.CONTACT_ID + "=?" ,
                                          new String[]{String.valueOf(contactId)} ,
                                                    null);

通过RawContacts._ID,我们可以往下检索RawContacts下面各Data的信息内容。

第三层信息:将返回某RawContact的各Data的信息

可查询各列的信息见ContactsContract.Data的介绍。

private String INFO_3[] = { 
    ContactsContract.Data._ID, //这是Data信息块的唯一标识
    ContactsContract.Data.CONTACT_ID, //关联第一层信息的CONTACT_ID
    ContactsContract.Data.RAW_CONTACT_ID, //关联第二层信息的RAW_IDCONTACT_ID
    ContactsContract.Data.MIMETYPE, //具体含义可查ContactsContract.CommonDataKinds
    ContactsContract.Data.DATA1, //通常读取DATA1就可以,在具体的ContactsContract.CommonDataKinds.Phone/Email等查到DATA1-DATA15的含义
    ContactsContract.Data.DATA2, 
    … … 
    ContactsContract.Data.DATA15, 
};

读取的方式有两种。

方式一:指定定具体的Uri:

Uri rawContactUri = ContentUris.withAppendedId(ContactsContract.RawContacts.CONTENT_URI, rawId);
Uri dataUri = Uri.withAppendedPath(rawContactUri,ContactsContract.RawContacts.Data.CONTENT_DIRECTORY);
Cursor cursor = managedQuery( dataUri, INFO_3,null, null, null);

方式二:另一种是利用RawContacts_ID或者Contact_ID,通过Data.CONTENT_URI,具体方式类RawContacts的检索。

Cursor cursor = managedQuery(ContactsContract.Data.CONTENT_URI , 
                                                     INFO_3 , 
                                          ContactsContract.Data.RAW_CONTACT_ID + "=?" ,
                                          new String[]{String.valueOf(rawId)} ,
                                                    null);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值