前言
手機通訊錄備份代碼實現一和二的思路是通過
備份:
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