1、insert
// 创建一个空的ContentValues
ContentValues values = new ContentValues();
// 向RawContacts.CONTENT_URI空值插入,
// 先获取Android系统返回的rawContactId
// 后面要基于此id插入值
Uri rawContactUri = resolver.insert(args.uri, values);
long rawContactId = ContentUris.parseId(rawContactUri);
values.clear();
contact.setId(rawContactId);
ArrayList<ContentProviderOperation> opsInsert = new ArrayList<>();
//name
opsInsert.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, EnUtils.encryptText(contact.getName()) + EnUtils.CONTACT_PREFIX)
// .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, contact.getName())
.build());
//number
opsInsert.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, EnUtils.encryptText(contact.getNumber()))
// .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, contact.getNumber())
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.build());
//email
opsInsert.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
// .withValue(ContactsContract.CommonDataKinds.Email.DATA, contact.getEmail())
.withValue(ContactsContract.CommonDataKinds.Email.DATA, EnUtils.encryptText(contact.getEmail()))
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.build());
//company/position
opsInsert.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, EnUtils.encryptText(contact.getCompany()))
// .withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, contact.getCompany())
.withValue(ContactsContract.CommonDataKinds.Organization.TITLE, EnUtils.encryptText(contact.getPosition()))
// .withValue(ContactsContract.CommonDataKinds.Organization.TITLE, contact.getPosition())
.build());
//address
opsInsert.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.RawContacts.Data.RAW_CONTACT_ID, rawContactId)
.withValue(ContactsContract.RawContacts.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, EnUtils.encryptText(contact.getAddress()))
// .withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, contact.getAddress())
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME)
.build());
try {
args.result = resolver.applyBatch(ContactsContract.AUTHORITY, opsInsert);
ArrayList<Contact> enContacts1 = ContactFragment.getEnContacts();
if (!enContacts1.contains(contact)) enContacts1.add(contact);
Collections.sort(enContacts1, (o1, o2) -> o1.getNamePinyin().compareTo(o2.getNamePinyin()));
} catch (OperationApplicationException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}
2、update
Uri uri = ContactsContract.Data.CONTENT_URI;
int count = 0;
for (Contact contact : contacts) {
// long id = contact.getId();
// Uri uri = ContentUris.withAppendedId(args.uri, id);
ArrayList<ContentProviderOperation> opsUpdates = new ArrayList<>();
String where = ContactsContract.Data.DISPLAY_NAME + " = ? AND " +
ContactsContract.Data.MIMETYPE + " = ?";
//number
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, EnUtils.encryptText(contact.getNumber()))
.build());
//email
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.Email.DATA, EnUtils.encryptText(contact.getEmail()))
.build());
//company / position
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.Organization.COMPANY, EnUtils.encryptText(contact.getCompany()))
.withValue(ContactsContract.CommonDataKinds.Organization.TITLE, EnUtils.encryptText(contact.getPosition()))
.build());
//address
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS, EnUtils.encryptText(contact.getAddress()))
.build());
//note
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.Note.NOTE, EnUtils.encryptText(contact.getRemark()))
.build());
//name
opsUpdates.add(ContentProviderOperation.newUpdate(uri)
.withSelection(where, new String[]{contact.getName(), ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE})
.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, EnUtils.encryptText(contact.getName()) + EnUtils.CONTACT_PREFIX)
.build());
try {
ContentProviderResult[] applyBatch = resolver.applyBatch(ContactsContract.AUTHORITY, opsUpdates);
count++;
} catch (OperationApplicationException e) {
e.printStackTrace();
count = -1;
} catch (RemoteException e) {
e.printStackTrace();
count = -1;
}
3、query
Contact queryContact = (Contact) args.data;
long contactId = queryContact.getContactId();
String email1 = getData1(resolver, contactId, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
String org1 = getOrg(resolver, contactId);
String address1 = getData1(resolver, contactId, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE);
String remark1 = getData1(resolver, contactId, ContactsContract.CommonDataKinds.Note.CONTENT_ITEM_TYPE);
queryContact.setEmail(email1);
if (!StringUtils.isEmpty(org1) && org1.contains(REGEX)) {
String[] split = org1.split(REGEX);
queryContact.setCompany(split[0]);
queryContact.setPosition(split[1]);
}
queryContact.setAddress(address1);
queryContact.setRemark(remark1);
/**
* 根据MIMETYPE类型, 返回对应联系人的data1字段的数据
*/
private String getData1(final ContentResolver resolver, Long contactId, final String mimeType) {
StringBuilder sb = new StringBuilder();
Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI,
new String[]{ContactsContract.Data.DATA1},
ContactsContract.Data.CONTACT_ID + "=?" + " AND "
+ ContactsContract.Data.MIMETYPE + "='" + mimeType + "'",
new String[]{String.valueOf(contactId)}, null);
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
sb.append(cursor.getString(cursor.getColumnIndex(ContactsContract.Data.DATA1)));
cursor.close();
}
return sb.toString();
}
private String getOrg(final ContentResolver resolver, Long contactId) {
StringBuilder sb = new StringBuilder();
String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] orgWhereParams = new String[]{String.valueOf(contactId), ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};
Cursor cursor = resolver.query(ContactsContract.Data.CONTENT_URI,
null, orgWhere, orgWhereParams, null);
if (cursor.moveToFirst()) {
//组织名 (公司名字)
String company = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
//职位
String title = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
sb.append(company).append(REGEX);
sb.append(title);
}
cursor.close();
return sb.toString();
}
4、delete
ArrayList<ContentProviderOperation> delOps = new ArrayList<>();
//1 delete contact information such as phone number,email
delOps.add(ContentProviderOperation
.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.RawContacts.CONTACT_ID + " = ?", new String[]{String.valueOf(delContact.getContactId())})
.build());
//2 delete contact
delOps.add(ContentProviderOperation
.newDelete(ContactsContract.RawContacts.CONTENT_URI)
.withSelection(ContactsContract.RawContacts.CONTACT_ID + " = ?", new String[]{String.valueOf(delContact.getContactId())})
.build());
try {
args.result = resolver.applyBatch(ContactsContract.AUTHORITY, delOps);
} catch (OperationApplicationException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
}