操作联系人工程需要权限,不然会报错。

<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的含义。例如:

TypeAliasData column
StringADDRESSDATA1Email address itself.
intTYPEDATA2Allowed values are:
TYPE_CUSTOM. Put the actual type in LABEL.
TYPE_WORK
TYPE_OTHER
StringLABELDATA3

ADDRESS代表邮件地址摘data1中
邮件类型(工作邮件TYPE_WORK,自定义类型TYPE_CUSTOM,其他TYPE_OTHER)。
这些子类型有的厂商不需要那么详细就用了部分定义,但都遵循了这个标准结构都是相同的。

下面付代码,在log打印了所有详细信息,大家不需要那么详细的可以截取用。

更多相关文章

  1. Android(安卓)ContentProvider总结
  2. Android热修复三部曲之动态加载补丁.dex文件
  3. sqlite数据库默认自增标号RecNo与integer primary key autoincre
  4. Android音量相关知识总结(三)调节音量流程梳理
  5. Android学习日记-------SQLite数据库操作,SQL语句,Android(安卓)Ap
  6. HasMap 与 SparseArray
  7. android中对sim卡联系人的增删改查以及监听sim卡联系数据的改变
  8. Android逆向之旅—解析编译之后的Resource.arsc文件格式
  9. Android(安卓)Drawable Resource学习(二)、BitmapDrawable和Bitmap

随机推荐

  1. Android项目的目录结构详解
  2. Android加载Gif和ImageView的通用解决方
  3. Android GestureDetector
  4. Android_UI开发专题
  5. Android(安卓)intent and activity 经典
  6. 自定义SeekBarPreference控件(老外出品,直
  7. Android(安卓)- BroadcastReceiver
  8. Android学习笔记---第二天---基础UI组件-
  9. Android Support Library
  10. Android 操作SQLite数据库(初步)-在程序中