一、了解系统存储联系人的数据库
- Android系统存储联系人的数据库是contacts2.db,路径是:/data/data/com.android.providers.contacts/databases/contacts2.db
- 在真机上获取此contacts2.db需要获取Root权限。由于模拟器已经有Root权限,因此,可以直接查看。
- 在contacts2.db需要了解的主要有四个表:contacts、data、mimetype、raw_contact
1、 contacts表
- _id: 每条联系人数据唯一的id,其他表可以使用这个id找到相应的数据(自增长)
- photo_id:联系人的头像id。如果没有设置头像,则该字段的值为null
- times_contacted:与该联系人的通话次数
- custom_ringtone:为该联系人自定义铃声
- last_time_contacted:最后一次通话的时间
- send_to_voicemain:直接将来电转到语音信箱(0为不设置;1为设置)
- starred:是否为加星标的联系人(0为不加星;1为加星)
- has_phone_number:联系人拥有手机号码的数量
- lookup:是一个持久化的储存 因为用户可能会改名子 但是它改不了lookup
2、data表
- mimetype_id:该条数据的类型,根据该mimetype_id可去mimetype表查询该数据的类型
- row_contact_id:可以通过此id获取数据
- data1:该条数据的具体内容
3、mimetype表
4、raw_contact表
- contact_id:该条数据contact表中的id,联系人的唯一id,通过此id可去data表中获取联系人具体信息
- deleted:是否已删除(0为没有,1为删除)
- display_name:联系人名字
本案例只读取联系人的姓名和手机号码,读取其他数据也是大同小异,就不一一列举。
二、在row_contacts表中读取所有联系人id
// 用于存储联系人姓名和电话号码
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
Uri rowContactsUri = Uri.parse("content://com.android.contacts/raw_contacts");
Cursor rowContactsCursor = getContentResolver().query(rowContactsUri,
new String[] { "contact_id" }, null, null, null);
三、根据联系人id从data表中查询的数据(联系人姓名和手机号码)
if (rowContactsCursor != null) {
while (rowContactsCursor.moveToNext()) {
String contactId = rowContactsCursor.getString(0);
Cursor dataCursor = getContentResolver().query(dataUri,
new String[] { "data1", "mimetype"},
"contact_id=?",
new String[] { contactId }, null);
}
}
四、根据mimetype表把查询到的数据进行区分(联系人名字和电话号码)
if (dataCursor != null) {
HashMap<String, String> hashMap = new HashMap<String, String>();
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
// 根据mimetype区分联系人名字和电话号码
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
hashMap.put("phone", data1);
} else if ("vnd.android.cursor.item/name".equals(mimetype)) {
hashMap.put("name", data1);
}
}
contactList.add(hashMap);
}
五、完整代码
/**
* 读取所有联系人的姓名和号码,并存到ArrayList中
* @return ArrayList
*/
private ArrayList<HashMap<String, String>> readContacts() {
Uri rowContactsUri = Uri
.parse("content://com.android.contacts/raw_contacts");
Uri dataUri = Uri.parse("content://com.android.contacts/data");
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
// 在row_contacts中读取联系人id
Cursor rowContactsCursor = getContentResolver().query(rowContactsUri,
new String[] { "contact_id" }, null, null, null);
// 根据联系人id从data表中查询相应的电话号码以及联系人名字
if (rowContactsCursor != null) {
while (rowContactsCursor.moveToNext()) {
String contactId = rowContactsCursor.getString(0);
Cursor dataCursor = getContentResolver().query(dataUri,
new String[] { "data1", "mimetype" }, "contact_id=?",
new String[] { contactId }, null);
if (dataCursor != null) {
HashMap<String, String> hashMap = new HashMap<String, String>();
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
// 根据mimetype区分联系人名字和电话号码
if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {
hashMap.put("phone", data1);
} else if ("vnd.android.cursor.item/name"
.equals(mimetype)) {
hashMap.put("name", data1);
}
}
contactList.add(hashMap);
}
}
}
return contactList;
}
第一次写博客,而且安卓正处于学习阶段,希望作为笔记使用。如有错误,麻烦在评论中指出,谢谢