Android系统联系人信息通过 ContentProvider提供给我们使用,具体请参看contacts2.db
一、获取所有的分组信息
public List getAllGroupInfo() {
List groupList = new ArrayList();
Cursor cursor = null;
try {
cursor =
context.getContentResolver().query(Groups.CONTENT_URI,
null, null, null, null);
while (cursor.moveToNext()) {
GroupEntity ge = new GroupEntity();
int groupId =
cursor.getInt(cursor.getColumnIndex(Groups._ID)); // 组id
String groupName = cursor.getString(cursor
.getColumnIndex(Groups.TITLE)); // 组名
ge.setGroupId(groupId);
ge.setGroupName(groupName);
Log.i("MainActivity", "group id:" + groupId +
">>groupName:"
+ groupName);
groupList.add(ge);
ge = null;
}
return groupList;
} finally {
if (cursor != null) {
cursor.close();
}
}
}
二、获取某个分组下的所有联系人信息
public List getAllContactsByGroupId(int groupId)
{
String[] RAW_PROJECTION = new String[] {
ContactsContract.Data.RAW_CONTACT_ID, };
String RAW_CONTACTS_WHERE =
ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID
+ "=?"
+ " and "
+ ContactsContract.Data.MIMETYPE
+ "="
+ "'"
+
ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE
+ "'";
// 通过分组的id 查询得到RAW_CONTACT_ID
Cursor cursor =
context.getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
RAW_PROJECTION,
RAW_CONTACTS_WHERE, new String[] { groupId + "" }, "data1
asc");
List contactList = new ArrayList();
while (cursor.moveToNext()) {
// RAW_CONTACT_ID
int col =
cursor.getColumnIndex("raw_contact_id");
int raw_contact_id = cursor.getInt(col);
// Log.i("getAllContactsByGroupId", "raw_contact_id:"
+
// raw_contact_id);
ContactEntity ce = new ContactEntity();
ce.setContactId(raw_contact_id);
Uri dataUri =
Uri.parse("content://com.android.contacts/data");
Cursor dataCursor =
context.getContentResolver().query(dataUri,
null, "raw_contact_id=?",
new String[] { raw_contact_id + "" }, null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
String mime = dataCursor.getString(dataCursor
.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(mime))
{
ce.setTelNumber(data1);
} else if ("vnd.android.cursor.item/name".equals(mime))
{
ce.setContactName(data1);
}
}
dataCursor.close();
contactList.add(ce);
ce = null;
}
cursor.close();
return contactList;
}
三、获取所有的联系人信息
public List getAllContacts() {
// 1.查询raw_contacts表 获取所有联系人的id
Uri rawUri =
Uri.parse("content://com.android.contacts/raw_contacts");
Uri dataUri =
Uri.parse("content://com.android.contacts/data");
List contaList = new ArrayList();
Cursor idCursor =
context.getContentResolver().query(rawUri,
new String[] { "contact_id" }, null, null,
null);
while (idCursor.moveToNext()) {
int id = idCursor.getInt(0); // 得到联系人的id
ContactEntity ce = new ContactEntity();
ce.setContactId(id);
Cursor dataCursor =
context.getContentResolver().query(dataUri,
null, "raw_contact_id=?", new String[] { id+"" },
null);
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(dataCursor
.getColumnIndex("data1"));
String mime = dataCursor.getString(dataCursor
.getColumnIndex("mimetype"));
if ("vnd.android.cursor.item/phone_v2".equals(mime))
{
ce.setTelNumber(data1);
} else if ("vnd.android.cursor.item/name".equals(mime))
{
ce.setContactName(data1);
}
}
dataCursor.close();
contaList.add(ce);
ce = null;
}
idCursor.close();
return contaList;
}
四、通过联系人ID查询该联系人所属分组
private void getGroup(ContentResolver resolver,String
contactId){
Cursor cursor=null;
String[] groups= new
String[]{GroupMembership.GROUP_ROW_ID};
String
where=GroupMembership.CONTACT_ID+"="+contactId+" AND"
+Data.MIMETYPE + "=" + " ' " + GroupMembership.CONTENT_ITEM_TYPE+"
' ";
cursor=resolver.query(Data.CONTENT_URI,
groups, where, null, null);
while(cursor.moveToNext()){
String
id=cursor.getString(cursor.getColumnIndex(GroupMembership.GROUP_ROW_ID));
Log.i(TAG, "查询分组结果:"+id);
}
}
代码说明:
contactId : 联系人ID
GroupMembership.GROUP_ROW_ID :分组ID
Data.MIMETYPE + "=" + " ' " +
GroupMembership.CONTENT_ITEM_TYPE+" ' "
表示DATA表中属于分组信息的数据,MIMETYPE表示数据类型。
技术说明:
分组信息保存在URI为android.provider.ContactsContract.Groups.CONTENT_URI的分组表中。这个表定义了分组的ID、名称及修改等各种信息。
但联系人的分组信息保存在URI为android.provider.ContactsContract.Data.CONTENT_URI的表中。分组记录的Data.MIMETYPE值为android.provider.ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE。
android.provider.ContactsContract.CommonDataKinds.GroupMembership类定义了在DATA表(URI为Data.CONTENT_URI)中有哪些分组信息的字段,如GroupMembership.GROUP_ROW_ID,是分组的ID,对应着分组表(URI为.Groups.CONTENT_URI)的Groups._ID字段。
以上代码 在Android 4.0.3上测试没有问题
注:新建、删除群组等操作如下:
新建组(名字为name): ContentValues values = new
ContentValues(); values.put(Groups.TITLE,
name); getContentResolver().inser(Groups.CONTENT_URI, values);
删除组(Id为groupId): getContentResolver().delete(Uri.parse(Groups.CONTENT_URI +"?"
+ContactsContract.CALLER_IS_SYNCADAPTER +
"=true"),Groups._ID+"="+groupId,null);
给组重命名(oldName;newName;groupId):
Uri uri = ContentUris.withAppendedId(Groups.CONTENT_URI, groupId);
ContentValues values = new ContentValues();
values.put(Groups.TITLE,newName);
getContentResolver().update(uri,values,null,null);
给组添加成员(groupId,personId):
ContentValues values = new ContentValues(); values.put(ContactsContract.CommonDataKinds.GroupMembership.RAW_CONTACT_ID,personId);
values.put(ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID,groupId);
values.put(ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI,
values); 给组移除成员(groupId,personId):
getContentResolver().delete(ContactsContract.Data.CONTENT_URI,ContactsContract.CommonDataKinds.GroupMembership.RAW_CONTACT_ID
+ "=? and "
+ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID +
"=? and "
+ContactsContract.CommonDataKinds.GroupMembership.MIMETYPE +
"=?",new String[]{"" + personId,"" +
groupId,ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE});