操作联系人工程需要权限,不然会报错。
<uses-permission android:name="android.permission.READ_CONTACTS" ></uses-permission>
<uses-permission android:name="android.permission.WRITE_CONTACTS" ></uses-permission>
android联系人是用数据库存储的,数据库结构如下:
raw_contacts表:
主要存储了每个联系个的唯一表示字段_id字段。
data表:
raw_contact_id就是raw_contacts中的_id字段,所有raw_contact_id值相同的都是
同一个联系人的属性信息。
mimetype_id 字段就是表示单点这条记录是默认联系的什么属性(例如:手机号,邮箱)
mimetypes表:
_id字段就是data表中的mimetype_id,
mimetype就是对应的联系人属性类型。某一个miemetype又有子类型(例如:miemetype 为手机号,
手机号又分为,工作手机号,住宅手机号(android里1开头的都认为是手机号,其他为座机号)),
这些子类型标识存在data表中的data1-data15某个字段中,子类型的解释在api 参考文档里。一条记录mimetype
类型决定data1-data15的意义。例如:
mimetype姓名,data1 为全称,则data2存放名,data3存放姓。
mimetype电话,data1存放电话号码,则data2存放类型,比如手机、家电(以一个数值表示,对应关系参看api,在api哪个地方下面的内容会说);
知道了这些表是存联系人的,该如何访问呢
代表联系人各个表的类是level5以前是Contacts,之后是ContactsContract,这个类里面有很多的内部类,
ContactsContract.RawContacts就是代表了表raw_contacts(可以查询所有联系人的id)
ContactsContract.Data就代表了表data(可以查询每个id联系人的详细信息)
这表的访问是通过URI在访问的,例如raw_contacts表的访问URI是ContactsContract.RawContacts.CONTENT_URI
查询某个字段可以通过ContactsContract.RawContacts的代表表字段常量,例如查_id字段对应的ContactsContract.RawContacts的常量是ContactsContract.RawContacts._ID。
例如(resolver.query(RawContacts.CONTENT_URI,new String[] { RawContacts._ID }, null, null, null); // 获得_id属性)
得带了raw_contact表中的_id值就可以查这个_id对应联系人的详细信息了。
例如:resolver.query(Data.CONTENT_URI, new String[] {
Data.MIMETYPE, Data.DATA1, Data.DATA2, Data.DATA3,
Data.DATA4, Data.DATA5, Data.DATA6, Data.DATA7, Data.DATA8,
Data.DATA9, Data.DATA10, Data.DATA11, Data.DATA12,
Data.DATA13, Data.DATA14, Data.DATA15 }
这里得到的Data.MIMETYPE就是mimetype字段,对应的字符mimetypes表中mimetype字段的字符串,应该是内部做了联合查询。
有了Data.MIMETYPE类型,就可以参看api参考知道用了data1-data15那些字段,各个字段的含义,含义在ContactsContract.CommonDataKinds类中,ContactsContract.CommonDataKinds一个内部类代表一种mimetype。
例如mimeType.equals(Email.CONTENT_ITEM_TYPE);
mimeType就是类型字符串,Email就是邮件类型对应的类,这个类中详细说明了data1-data15的含义。例如:
Type Alias Data column
String ADDRESS DATA1 Email address itself.
int TYPE DATA2 Allowed values are:
TYPE_CUSTOM. Put the actual type in LABEL.
TYPE_WORK
TYPE_OTHER
String LABEL DATA3
ADDRESS 代表邮件地址摘data1中
邮件类型(工作邮件TYPE_WORK,自定义类型TYPE_CUSTOM,其他TYPE_OTHER)。
这些子类型有的厂商不需要那么详细就用了部分定义,但都遵循了这个标准结构都是相同的。
下面付代码,在log打印了所有详细信息,大家不需要那么详细的可以截取用。