本文主要是介绍获取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
如下图所示:
- Email 邮箱
- Im 即时通讯
- Nickname 昵称
- 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为例)
- 通过ContactsContract.CommonDataKinds.Nickname.CONTENT_ITEM_TYPE 获取对应的cursor
- 通过ContactsContract.CommonDataKinds.Nickname.NAME不同的参数取该cursor下对应的信息,每类信息都有什么类型的信息,见上面提到的 字段API
套路都是一样的,这里不再赘述。
这篇关于获取Android Contacts联系人信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!