Android 获取手机联系人信息
//获取联系人 Uri rawContacts = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(rawContacts, null, null, null, null); while (cursor.moveToNext()) { String contactId = cursor.getString(cursor.getColumnIndex("contact_id")); Uri dataUri = Uri.parse("content://com.android.contacts/data"); System.out.println("联系人id = " + contactId); Cursor dataCursor = contentResolver.query(dataUri, null, "contact_id=?", new String[]{contactId}, null); while (dataCursor.moveToNext()) { System.out.println("联系人名称="+dataCursor.getString(dataCursor.getColumnIndex("data1"))); System.out.println("数据类型="+dataCursor.getString(dataCursor.getColumnIndex("mimetype"))); } dataCursor.close(); System.out.println("——————————————"); } cursor.close();
通信录的相关数据也保存在数据库文件中,保存的路径为:/data/data/com.android.providers.contacts/databases/contacts2.db。我们在通讯录界面上添加联系人时,内部实际上是通过ContentProvider向数据库中添加记录。通讯录的界面应用与ContentProvider应用是分开的。通讯录界面应用的保存位置为:/data/data/com.android.contacts。
常用的几张表如下:
表raw_contacts:存放联系人的ID
字段display_name:存放姓+名的组合,便于快速得到用户的姓名。注意,当向该表添加联系人时该字段是为null的,只有在向data表中添加姓名时,才会发出update语句来更新该字段。
表data:存放联系人的详细信息,如姓名、手机等,主要几个字段的含义如下:
字段data1:存放具体数据
字段data2:对于电话号码,存放类型:家庭电话、手机号等,2代表手机号
对于邮箱,存放类型
对于姓名,存放名字部分,data3存放姓氏部分
字段mimetype_id:区分数据的类型,5-电话数据,6-姓名数据,1-email数据,对应表mimetypes中的记录ID
这两个表的对应关系是:raw_contacts 1:N data
表mimetypes:数据的类型,如下图:
使用ContentResolver对通信录中的数据进行添加、删除、修改和查询操作,需要加入读写联系人信息的权限
<uses-permissionandroid:name="android.permission.READ_CONTACTS" />
<uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />
文章参考了:http://hi.baidu.com/sonmeika/item/19e46c728f61ab356cc37c46