Android——添加联系人
概述
方式一:使用ContentResolver多次写入,每次写入一个字段
第一步
- 往手机联系人应用中的raw_contacts表添加一条记录
raw_contacts表
ContentValues values = new ContentValues();
// 往 raw_contacts 添加联系人记录,并获取添加后的联系人编号
Uri uri = resolver.insert(ContactsContract.RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(uri);
第二步
- 将对应数据通过raw_contacts中的id与data表进行关联,插入对应相应数据
data表
- 记录了用户的通讯录所有数据,包括手机号,显示名称等,但是里面的mimetype_id表示不同的数据类型,这与表mimetypes表中的id相对应。
ContentValues name = new ContentValues();
// 关联联系人编号
name.put(Contacts.Data.RAW_CONTACT_ID, rawContactId);
// 姓名的数据类型
name.put(Contacts.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
// 联系人的姓名
name.put(Contacts.Data.DATA2, contact.name);
// 添加联系人姓名记录
resolver.insert(ContactsContract.Data.CONTENT_URI, name);
mimetype表
方式二:往手机通讯录一次性添加一个联系人信息
private void addFullContacts(ContentResolver resolver, Contact contact) {
// 创建一个插入联系人主记录的内容操作器
ContentProviderOperation op_main = ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME,null)
.build();
// 创建一个插入联系人姓名记录的内容操作器
ContentProviderOperation op_name = ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id
.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0)
.withValue(Contacts.Data.MIMETYPE, CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(Contacts.Data.DATA2, contact.name)
.build();
// 创建一个插入联系人电话号码记录的内容操作器
ContentProviderOperation op_phone = ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id
.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0)
.withValue(Contacts.Data.MIMETYPE, CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(Contacts.Data.DATA1, contact.phone)
.withValue(Contacts.Data.DATA2, CommonDataKinds.Phone.TYPE_MOBILE)
.build();
// 创建一个插入联系人电子邮箱记录的内容操作器
ContentProviderOperation op_email = ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
// 将第0个操作的id,即raw_contacts的id作为data表中的raw_contact_id
.withValueBackReference(Contacts.Data.RAW_CONTACT_ID, 0)
.withValue(Contacts.Data.MIMETYPE, CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(Contacts.Data.DATA1, contact.email)
.withValue(Contacts.Data.DATA2, CommonDataKinds.Email.TYPE_WORK)
.build();
// 声明一个内容操作器的列表,并将上面四个操作器添加到该列表中
ArrayList<ContentProviderOperation> operations = new ArrayList<>();
operations.add(op_main);
operations.add(op_name);
operations.add(op_phone);
operations.add(op_email);
try {
// 批量提交四个操作
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
} catch (OperationApplicationException e) {
throw new RuntimeException(e);
} catch (RemoteException e) {
throw new RuntimeException(e);
}
}
查询联系人
@SuppressLint("Range")
private void readPhoneContacts(ContentResolver resolver) {
// 先查询 raw_contacts 表,再根据 row_contacts_id 去查询 data 表
Cursor cursor = resolver.query(ContactsContract.RawContacts.CONTENT_URI, new String[]{ContactsContract.RawContacts._ID}, null, null, null, null);
while (cursor.moveToNext()) {
int rawContactId = cursor.getInt(0);
Uri uri = Uri.parse("content://com.android.contacts/contacts/" + rawContactId + "/data");
Cursor dataCursor = resolver.query(uri, new String[]{Contacts.Data.MIMETYPE, Contacts.Data.DATA1, Contacts.Data.DATA2}, null, null, null);
Contact contact = new Contact();
while (dataCursor.moveToNext()) {
String data1 = dataCursor.getString(dataCursor.getColumnIndex(Contacts.Data.DATA1));
String mimeType = dataCursor.getString(dataCursor.getColumnIndex(Contacts.Data.MIMETYPE));
switch (mimeType) {
// 姓名
case CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE:
contact.name = data1;
// 电话
case CommonDataKinds.Phone.CONTENT_ITEM_TYPE:
contact.phone = data1;
// 邮箱
case CommonDataKinds.Email.CONTENT_ITEM_TYPE:
contact.email = data1;
}
}
dataCursor.close();
Log.d("AAAA", contact.toString());
}
cursor.close();
}
案例代码