主要逻辑代码如下
单查询/增加联系人
/**
* 写入手机联系人
*/
private void writeContact() {
String name = "test";
String number = "13666668888";
//先查询要添加的号码是否已存在通讯录中, 不存在则添加. 存在则提示用户
Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number);
ContentResolver resolver = getContentResolver();
//从raw_contact表中返回display_name
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null);
if (cursor == null)
return;
if (cursor.moveToFirst()) {
Log.i("nn", "name=" + cursor.getString(0));
Toast.makeText(this, "存在相同号码", Toast.LENGTH_SHORT).show();
} else {
uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentValues values = new ContentValues();
long contact_id = ContentUris.parseId(resolver.insert(uri, values));
//插入data表
uri = Uri.parse("content://com.android.contacts/data");
//add Name
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name");
values.put("data2", "qq");
values.put("data1", name);
resolver.insert(uri, values);
values.clear();
//add Phone
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");
values.put("data2", "2"); //手机
values.put("data1", number);
resolver.insert(uri, values);
values.clear();
//add email
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/email_v2");
values.put("data2", "1"); //邮箱
values.put("data1", "[email protected]");
resolver.insert(uri, values);
values.clear();
//add organization
values.put("raw_contact_id", contact_id);
values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/organization");
values.put("data4", "产品经理"); //职务
values.put("data1", "腾讯科技"); //公司
resolver.insert(uri, values);
values.clear();
Toast.makeText(this, "插入号码成功", Toast.LENGTH_SHORT).show();
}
cursor.close();
}
注意: 使用魅族手机测试得到一个有趣的结果, 如果query时传入的只是一段短小的号码, 比如: 13612 那么会返回所有匹配包含到这各字段的结果, 例如有两个号码分别是 13612 99 8888 / 139 13612 888 .
那么最终查询则会返回号码存在的结果
删除联系人
/**
* 删除联系人
*/
private void deleteContact() {
String name = "test";
//根据姓名求id
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null);
if (cursor == null)
return;
if (cursor.moveToFirst()) {
int id = cursor.getInt(0);
//根据id删除data中的相应数据
resolver.delete(uri, "display_name=?", new String[]{name});
uri = Uri.parse("content://com.android.contacts/data");
resolver.delete(uri, "raw_contact_id=?", new String[]{id + ""});
Toast.makeText(this, "删除号码成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show();
}
cursor.close();
}
更改联系人
/**
* 更改联系人
*/
private void changeContact(){
String name = "test";
String newPhone = "13644440000";
//根据姓名求id
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null);
if (cursor == null)
return;
if (cursor.moveToFirst()) {
int id = cursor.getInt(0);
ContentValues values = new ContentValues();
values.put("data1", newPhone);
resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2", id + ""});
}else{
Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show();
}
cursor.close();
}
列表查询
private List> mContactList = new ArrayList<>();
/**
* 查询手机联系人并显示
*/
private void queryContactsShowData() {
mContactList.clear();
Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
if (cursor == null)
return;
while (cursor.moveToNext()) {
String phoneName;
String phoneNumber;
HashMap listItem = new HashMap<>();
phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
listItem.put("phoneName", phoneName);
listItem.put("phoneNumber", phoneNumber);
mContactList.add(listItem);
}
cursor.close();
mRv.setAdapter(new ContactAdapter());
mRv.setLayoutManager(new LinearLayoutManager(mContext));
}
附上测试的Demo
https://gitee.com/geekqian/ContactDemo/tree/master