安卓——读取到手机通讯录中的好友的备注信息

Posted Jason Zhang~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓——读取到手机通讯录中的好友的备注信息相关的知识,希望对你有一定的参考价值。

安卓应用开发时,需要读取手机通讯录信息算是一个很常见的需求了。但是一般也就获取通讯录好友的名字和号码两个信息就行了,方法也很简单:

// 获取手机联系人部分数据信息
ContentResolver resolver = getContentResolver();
Cursor phoneCursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
        new String[]
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID, // id
                ContactsContract.Contacts.DISPLAY_NAME, // 名字
                ContactsContract.CommonDataKinds.Phone.NUMBER // 号码
        , null, null, null);
if (phoneCursor != null) 
                while (phoneCursor.moveToNext()) 
                    // 获得联系人的ID
                    int idColumn = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                    String contactId = phoneCursor.getString(idColumn);
                    // 获得联系人姓名
                    int displayNameColumn = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                    String contactName = phoneCursor.getString(displayNameColumn);
                    // 获得联系人号码
                    int NumberColumn = phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                    String contactNumber = phoneCursor.getString(displayNameColumn);
                    // 打印或者其他操作
                
            

如上便是使用系统提供的方法,查询手机通讯录内的好友的名字和号码,然后可以做打印显示或者其他自定义操作。

一个联系人可能有多个号码,有时候需求是要显示所有号码,有时候则只显示某一个。这些就都属于根据需求再做一些新的处理了。另外通讯录里面也有很多数据表,有很多数据,但是都不太常用,百度也一大堆教程,不赘述。这里只记录我遇到的一个奇葩需求。

有个项目,需求是要获取通讯录好友的名字、号码、备注三个字段。需要拿备注这个字段的需求绝对算是奇葩,反正我直接百度搜索怎么获取到手机通讯录好友的备注信息,没有得到直观的直接的方法,应该很少人会遇到需要做这个吧…….
网上一通查询没有得到想要的答案,就自己使用模拟器,添加了一个好友,名字为“123”,号码为“13012341234”,备注为“123456123456”。然后拿出来了contacts2.db,这个就是通讯录的数据库了。有过经验的人都知道,这里面主要是看四个表,其中有一个名字叫“data”的表,没错,大部分数据都是存储在这个表,该表下数据如下:

在这里我们看到刚才新增通讯录的三个字段数据都在!然后它们的共同点是“raw_contact_id”都是1,这个就是联系人id了,代表这是同一个人的数据信息。不相同的一个重要字段是“mimetype_id”,这里“mimetype_id”为11的就是保存了备注信息,然后赶紧写代码查询data表下面的“mimetype_id”为11的data1的值,然后在真机上运行测试,发现没有找到数据,查看发现真机上备注字段的“mimetype_id”并不是11。
了解数据库,尤其是自己设计过数据库表的人应该都知道,良好的数据库都是使用表关联的,这里肯定也不会是写死11就是代表什么。在contacts2.db数据库中能找到表mimetypes。

根据上图的类型表我们能看到类型的一一对应,id为11名字为“vnd.android.cursor.item/note”的类型就是保存备注字段的了。id可能每个手机上都不一样,那么这个名字应该都是统一的了吧,在系统类“ContactsContract”中我们搜索到了该字符串“vnd.android.cursor.item/note”。

更惊喜的是,我们发现这个Note类下面就两个属性,下面的NOTE常量指向的就是“data1”的取值。这样一来我们就知道如何写代码来查询到备注信息咯。

Cursor phoneCursor3 = getContentResolver().query(
                                    ContactsContract.Data.CONTENT_URI, null,
                                    "raw_contact_id=? and " + ContactsContract.Data.MIMETYPE + "=?",
                                    new String[]contactId, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE, null);
                            if (phoneCursor3.moveToFirst())
                                String contactRemark = phoneCursor3.getString(    phoneCursor3.getColumnIndex(ContactsContract.CommonDataKinds.Note.NOTE));

如上代码,就能根据通讯录好友的id查询到它的备注栏信息了。
时间有限,仅简单记录下,如果需要查询获取到其他信息,方法应该都大同小异。最后不得不说一句,系统底层源码及设计思想等,确实很值得我们开发者好好研究和学习。

以上是关于安卓——读取到手机通讯录中的好友的备注信息的主要内容,如果未能解决你的问题,请参考以下文章

个人微信Hook-C#Demo开发SDK

手机通讯录联系人恢复的教程文

微信通讯录下面的#分组是啥意思

关于各类APP应用权限的说明和操作指南!

微信备注有的可以打空格

如何用代码读取Office Online Server2016的文档的备注信息