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

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

// 获取手机联系人部分数据信息
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查询到它的备注栏信息了。
时间有限,仅简单记录下,如果需要查询获取到其他信息,方法应该都大同小异。最后不得不说一句,系统底层源码及设计思想等,确实很值得我们开发者好好研究和学习。

读取Android手机通讯录,可以使用Android提供的ContentResolver类和ContactsContract类。下面是一个简单的示例代码: ```java import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; import android.provider.ContactsContract; public class ContactReader { public static void readContacts(Context context) { ContentResolver contentResolver = context.getContentResolver(); Cursor cursor = null; try { cursor = contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); if (cursor != null && cursor.getCount() > 0) { while (cursor.moveToNext()) { String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Cursor phoneCursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); if (phoneCursor != null && phoneCursor.moveToNext()) { String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); System.out.println("Name: " + name + ", Phone Number: " + phoneNumber); } if (phoneCursor != null) { phoneCursor.close(); } } } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } } } } ``` 在上面的代码,我们首先获取ContentResolver对象,然后使用它查询ContactsContract.Contacts.CONTENT_URI来获取所有联系人的ID和名称。接着,我们使用联系人ID查询ContactsContract.CommonDataKinds.Phone.CONTENT_URI来获取联系人的电话号码。最后,我们打印联系人的名称和电话号码。调用readContacts()方法即可读取手机通讯录
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值