【Android】【小记】获取系统通讯录的联系人信息

来源:互联网 发布:台湾ptt评论知乎文章 编辑:程序博客网 时间:2024/06/07 00:48

一、了解系统存储联系人的数据库

  • 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表

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;    }

第一次写博客,而且安卓正处于学习阶段,希望作为笔记使用。如有错误,麻烦在评论中指出,谢谢


原创粉丝点击