【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表
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; }
第一次写博客,而且安卓正处于学习阶段,希望作为笔记使用。如有错误,麻烦在评论中指出,谢谢
阅读全文
0 0
- 【Android】【小记】获取系统通讯录的联系人信息
- android 获取通讯录联系人信息
- Android:获取通讯录联系人信息
- Android 获取通讯录联系人信息
- android调用系统通讯录程序,获取联系人信息
- IOS获取系统通讯录联系人信息
- IOS获取系统通讯录联系人信息
- IOS获取系统通讯录联系人信息
- IOS获取系统通讯录联系人信息
- iOS 调用系统通讯录 获取联系人信息
- iOS 获取系统通讯录联系人信息
- Android:获取手机通讯录中联系人的信息
- Android 获取通讯录联系人信息(上)
- Android软件开发获取通讯录联系人信息
- 【Android】获取手机通讯录中的联系人信息
- Android软件开发获取通讯录联系人信息
- 获取通讯录联系人信息
- 获取Android系统的联系人信息
- Arduino 与树莓派 Raspberry Pi 相比各自有什么优缺点
- Pro ASP.NET Core MVC(二)【第一个MVC 应用程序】
- 网络性能测试-perf
- leetcode92. Reverse Linked List II
- JS得到CSS的样式
- 【Android】【小记】获取系统通讯录的联系人信息
- STL快速全排列函数next_permutation与pre_permutation
- 在Eclipse中新建类的时候如何自动添加注释
- 有关ssh免密登录时碰到的问题记录
- 基础练习 特殊回文数
- Retrofit用法详解
- 安卓Android-X86强制竖屏 安卓(Android)x86屏幕旋转解决方法
- JAVA——网络编程(2):Java编写的TCP网络程序
- Multiply String