前言
手机通讯录备份代码实现一和二的思路是通过
备份:
while循环找到contact_id然后根据id找对应联系人所有电话和邮箱.
还原:
获取联系人列表通过for循环,一个一个插入手机通讯录
这两种方式的弊端是
备份速度太慢,查询数据库太多次.
还原 没有进行批量插入,插入的速度也非常慢.
下面的方法查询手机500条联系人数据,组成一个对象,只需要2s左右(测试手机华为mate 20),还原手机通讯录的时间也比之前缩短很多.
思路:
备份:
1 查询所有联系人
2查询所有联系人
3 查询所有邮箱
然后三者合并
还原:
用ContentProviderOperation对象批量处理
代码实现
List<ContactListBean> contactListBeanList = getContactName(MainActivity.this);
List<PhoneListBean> phoneList = getContactPhone(MainActivity.this);
List<EmailListBean> emailListBeans = getContactEmail(MainActivity.this);
calculate(contactListBeanList,phoneList,emailListBeans);
private List<ContactListBean> getContactName(Activity context) {
Cursor cur = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, PROJECTION,
null, null, null);
List<ContactListBean> contactListBeanList = new ArrayList<>();
if (cur != null) {
final int displayNameIndex = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
final int hasPhoneNumberIndex = cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
while (cur.moveToNext()) {
ContactListBean contactListBean = new ContactListBean();
String displayName = cur.getString(displayNameIndex);
int phoneCount = cur.getInt(hasPhoneNumberIndex);
contactListBean.setContactsName(displayName);
contactListBean.setHasPhoneNumber(phoneCount > 0);
contactListBean.setPhoneList(new ArrayList<PhoneListBean>());
contactListBean.setEmailList(new ArrayList<EmailListBean>());
contactListBeanList.add(contactListBean);
}
cur.close();
// calculate(contactListBeanList, null, null);
}
return contactListBeanList;
}
private List<PhoneListBean> getContactPhone(Activity context) {
List<PhoneListBean> phoneList = new ArrayList<>();
Cursor phonesCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
PROJECTIONPHONE, null,
null, null);
if (phonesCursor != null) {
final int numberIndex = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
final int numberTypeIndex = phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
final int displayNameIndex = phonesCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
while (phonesCursor.moveToNext()) {
PhoneListBean phoneListBean = new PhoneListBean();
String phoneNumber = phonesCursor.getString(numberIndex);
int type = phonesCursor.getInt(numberTypeIndex);
String displayName = phonesCursor.getString(displayNameIndex);
phoneListBean.setType(type);
phoneListBean.setNumber(phoneNumber);
phoneListBean.contactsName=displayName;
phoneList.add(phoneListBean);
}
phonesCursor.close();
}
return phoneList;
// calculate(null, phoneList, null);
}
private List<EmailListBean> getContactEmail(Activity context) {
//邮箱
List<EmailListBean> emailListBeans = new ArrayList<>();
Cursor emailCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTIONEMAIL,
null, null, null);
if (emailCur != null) {
if (emailCur.getCount() > 0) {
final int displayNameIndex = emailCur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
final int emailIndex = emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1);
final int emailTypeIndex = emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE);
while (emailCur.moveToNext()) {
EmailListBean emailListBean = new EmailListBean();
String email = emailCur.getString(emailIndex);
int type = emailCur.getInt(emailTypeIndex);
String displayName = emailCur.getString(displayNameIndex);
emailListBean.setEmail(email);
emailListBean.setType(type);
emailListBean.contactsName= displayName;
emailListBeans.add(emailListBean);
}
}
emailCur.close();
}
return emailListBeans;
// calculate(null, null, emailListBeans);
}
List<ContactListBean> contactListBeanListTemp;
List<PhoneListBean> phoneListTemp;
List<EmailListBean> emailListBeansTemp;
private boolean isEnableCalculate=true;
private synchronized void calculate(List<ContactListBean> contactListBeanList,
List<PhoneListBean> phoneList,
List<EmailListBean> emailListBeans) {
if (contactListBeanListTemp == null) {
contactListBeanListTemp = contactListBeanList;
}
if (phoneListTemp == null) {
phoneListTemp = phoneList;
}
if (emailListBeansTemp == null) {
emailListBeansTemp = emailListBeans;
}
if (contactListBeanListTemp != null && phoneListTemp != null && emailListBeansTemp != null) {
Log.e(TAG, "contactListBeanListTemp.size" + contactListBeanListTemp.size() + "---" + phoneListTemp.size()
+ "---" + emailListBeansTemp.size());
for (ContactListBean contactListBean : contactListBeanListTemp) {
for (PhoneListBean phoneListBean : phoneListTemp) {
if(contactListBean.getContactsName().equals(phoneListBean.contactsName)){
if(contactListBean.isHasPhoneNumber()){
phoneListBean.contactsName=null;
contactListBean.getPhoneList().add(phoneListBean);
}
}
}
for (EmailListBean emailListBean : emailListBeansTemp) {
if( contactListBean.getContactsName().equals(emailListBean.contactsName)){
emailListBean.contactsName=null;
contactListBean.getEmailList().add(emailListBean);
}
}
}
String json = new Gson().toJson(contactListBeanListTemp);
String jsonStr = new Gson().toJson(json);
Log.e(TAG, "contactListBeanListTemp.size" + contactListBeanListTemp.size());
}
}
还原代码实现
如果还原的数据有联系人没有手机号,默认用更新update方法,这样通讯录不会还原的时候多数据
Test test = getAssetFile();
List<ContactListBean> contactListBeanList = test.getContactList();
insertContact(contactListBeanList);
public int insertContact(List<ContactListBean> contactListBeanList) {
boolean isCloudExitPhone = false;
if (contactListBeanList == null || contactListBeanList.size() == 0) {
return 0;
}
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
int rawContactInsertIndex = 0;
int resutl = 0;
for (ContactListBean contactListBean : contactListBeanList) {
rawContactInsertIndex = ops.size();
isCloudExitPhone = isCloudExistPhone(contactListBean);
if (isCloudExitPhone) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.withYieldAllowed(true)
.build());
} else {
// //update会新增数据,例如本地存在一个没有手机号的联系人,会新增进入
ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.withYieldAllowed(true)
.build());
}
//写入姓名
if (!TextUtils.isEmpty(contactListBean.getContactsName())) {
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, contactListBean.getContactsName())
.withYieldAllowed(true)
.build());
}
//写入电话
List<PhoneListBean> phoneList = contactListBean.getPhoneList();
if (phoneList != null && phoneList.size() > 0) {
for (PhoneListBean phoneListBean : phoneList) {
if(!TextUtils.isEmpty(phoneListBean.getNumber())){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneListBean.getNumber())
.withYieldAllowed(true)
.build());
}
}
}
//写入邮箱
List<EmailListBean> emailList = contactListBean.getEmailList();
if (emailList != null && emailList.size() > 0) {
for (EmailListBean emailListBean : emailList) {
//插入Email
if(!TextUtils.isEmpty(emailListBean.getEmail())){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, emailListBean.getEmail())
.withValue(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK)
.withYieldAllowed(true)
.build());
}
}
}
}
try {
ContentProviderResult[] results = getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
// if (results != null && results.length > 0) {
// for (ContentProviderResult result : results) {
// Log.e(TAG, "URI:" + result.uri + "count:" + result.count);
// }
// resutl++;
// }
Log.e(TAG, "results.length==" + results.length);
} catch (RemoteException | OperationApplicationException e) {
Log.e(TAG, "e.toString()==" + e.toString());
e.printStackTrace();
}
return resutl;
}
private static boolean isCloudExistPhone(ContactListBean contactListBean) {
if (contactListBean.getPhoneList() == null ||
contactListBean.getPhoneList().size() == 0
) {
return false;
}
if(TextUtils.isEmpty(contactListBean.getPhoneList().get(0).getNumber())){
return false;
}
return true;
}
源代码源https://download.csdn.net/download/qq_26296197/11974840