获取Android Contacts联系人信息

一个例子:

你是不是见多了这样的写法?

private void readContacts() {
    Cursor cursor = null;
    try {
        // 获取内容提供器
        ContentResolver resolver = getContentResolver();
        // 查询联系人数据
        cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null, null);
        // 遍历联系人列表
        while (cursor.moveToNext()) {
            // 获取联系人姓名
            String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            // 获取联系人手机号
            String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.v("yico", "Name:" + name + "\tPhone:" + number);
        }

        cursor = resolver.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null, null, null, null);
        while (cursor.moveToNext()) {
            String email = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
            Log.v("yico", "email:" + email);
        }

    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
}

它将所有的电话遍历,将所有的邮箱遍历,却没有对应关系,如果你需要单一的结果集合,那么这种方法也许是合适的,但如果你需要联系人所有信息,那么这种方法显然不能满足你的需求了。


API简介

1. 相关字段

点击跳转到 字段API

如下图所示:

字段

  1. Email 邮箱
  2. Im 即时通讯
  3. Nickname 昵称
  4. Phone 手机

所以,其实所有信息都是平级关系,属于contact的一种类型,那么查询方式应该都是一样的才对。

2. 查询

点击跳转到 查询API

如下图所示:

查询

api中已给出了标准的cursor获取方法,和上面的例子的查询方式不同是吗?这个查询其实还可以简化,如下图所示:

这里写图片描述

第二个参数如果传null,则表示查询所有信息,此处如果你不知道你要查到信息有什么字段,可传null,那么我们的cursor代码可以简化如下:

String phoneWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] phoneWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
Cursor phoneCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, phoneWhere, phoneWhereParams, null);

contactId是什么呢?它是每一个联系人的唯一id码,通过这个id,我们可以只查对应联系人的信息,也不是简单的遍历所有联系人信息。

3. 获取contactId

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

你可以通过遍历这个cursor拿到所有的联系人的id,然后查询该id下的联系人的其它信息。


一个例子

private void readAllContacts() {

    Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

    while (cursor.moveToNext()) {
        String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        Log.i("yico", " ");
        Log.i("yico", "联系人" + contactId + "\t" + name);

        /**
         * Nickname - 昵称
         */
        String nickWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
        String[] nickWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE};
        Cursor nickCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, nickWhere, nickWhereParams, null);
        while (nickCursor.moveToNext()) {
            String nickName = nickCursor.getString(nickCursor.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME));
            Log.i("yico", "nickName" + "\t" + nickName);
        }

        /**
         * Phone - 电话
         */
        String phoneWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
        String[] phoneWhereParams = new String[]{contactId, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE};
        Cursor phoneCursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, phoneWhere, phoneWhereParams, null);

        while (phoneCursor.moveToNext()) {
            int type = phoneCursor.getInt(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
            String phone = "";
            switch (type) {
                case 1:
                    phone = "HOME";
                    break;
                case 2:
                    phone = "MOBILE";
                    break;
                case 3:
                    phone = "WORK";
                    break; 
                default:
                    phone = "OTHER";
                    break;
            }
            phone += "\t" + phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            Log.i("yico", "phone" + "\t" + phone);
        }
    }
}    

从这个例子不难看出查询步骤:(以Nickname为例)

  1. 通过ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE 获取对应的cursor
  2. 通过ContactsContract.CommonDataKinds.Nickname.NAME不同的参数取该cursor下对应的信息,每类信息都有什么类型的信息,见上面提到的 字段API

套路都是一样的,这里不再赘述。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值