前言

手机通讯录备份代码实现一和二的思路是通过
备份:
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) {//插入Emailif(!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

手机通讯录备份代码实现三相关推荐

  1. 手机通讯录备份代码实现二

    手机通讯录备份代码实现二 package app.utils;import java.util.ArrayList; import java.util.List;import android.cont ...

  2. 手机通讯录备份代码实现一

    手机通讯录备份代码实现一 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFo ...

  3. android备份手机号码,Android手机通讯录备份还原代码

    最近想写段Android程序玩玩.开发环境 Eclipse ,Android 2.2 开发环境搭建 1.先安装jdk 2.下载安装eclipse 3.下载安装android sdk 4.安装eclip ...

  4. Android手机通讯录备份和恢复项目

    Android手机通讯录备份和恢复项目 附下载地址** 登录功能 注册功能 找回密码 修改密码 备份功能 恢复功能 恢复数据从服务器 导出为Excel文件 登录功能 注册功能 找回密码 同注册功能 修 ...

  5. 苹果通讯录怎么备份?手机通讯录备份的方法看这里!

    案例:手机通讯录怎么备份? [友友们,想问下苹果手机的通讯录怎么样才能进行备份?可以解答我的疑惑吗?感谢!] 在日常使用手机过程中,我们经常会遇到误删通讯录的情况.因此,备份通讯录是非常重要的,可以避 ...

  6. android手机通讯录备份还原代码,安卓手机误删联系人恢复及备份技巧总汇

    原标题:安卓手机误删联系人恢复及备份技巧总汇 现在很多手机都不再提供将联系人存入SIM卡中的功能了,所以如果你还习惯性的将联系人储存在手机内存当中,一旦手机丢失或者手机数据遗失,那么少则几十动辄几百的 ...

  7. 手机通讯录备份之后,如何在电脑上打开并且如何方便快速的导入另一个手机中

    之前用的是Nokia手机,现在换了一个Lenovo手机. 通讯录备份之后,将备份文件copy至PC上,然后将文件后缀改为.rar格式,解压之后找到contacts文件(在根文件夹里边多找几层,或者直接 ...

  8. 360 android手机备份通讯录,360手机卫士怎样备份手机通讯录 备份手机通讯录图文教程...

    软件安装:手机应用宝 随着科技的发展,手机在我们的生活中扮演了很重要的角色,手机在便利我们生活的同时,也会对我们造成很重要的影响.手机已经成为了我们的必需品,不仅是通讯工具,而且很大程度上都是娱乐功能 ...

  9. android手机通讯录备份还原代码,android手机通讯录备份还原代码

    最近想写段android程序玩玩. 开发环境 eclipse ,android2.2 开发环境搭建 1.先安装jdk 2.下载安装eclipse 3.下载安装android sdk 4.安装eclip ...

最新文章

  1. 测试思想 什么是软件测试(摘录)
  2. 实习小白::(转) Cocos2d-x 3.0开发(五)关联程序逻辑与cocoStudio导出文件
  3. 微服务架构下 CI/CD 如何落地
  4. 计算机类学生发专利,关于统计2020年老师指导本科生发表科研论文数和申请专利数的通知...
  5. wav音量和分贝转换关系_电吉他音箱瓦数与音量大小之间的关系
  6. LED计数电路,5输入按键编码器,7段数码管显示驱动集成为LED计数测试电路
  7. ios如何看idfv_如何无中生有资源搜索神器
  8. python 爱英斯坦台阶问题_关于Python青蛙跳台阶的问题详细讲解
  9. FILE类型指针的头文件
  10. android app打开流程_app开发模式的应用
  11. SparkSql 数据类型转换
  12. 关于整型和浮点型的输出问题
  13. win10 平板 刷android,Android平板电脑刷Win8 ARM平台将支持Win10
  14. PHP折算,PHP实现货币换算的方法
  15. 在VMware下新建虚拟机Win10系统
  16. Axure RP8手机边框
  17. 二次函数顶点式计算机,二次函数公式:顶点式、交点式、两根式
  18. 运维工程师是桥的护栏_运维工程师职务说明书
  19. 【Verilog】时序逻辑电路 -- 程序设计与应用
  20. 【文献阅读1】Comparative cytological and transcriptomic analysis of pollen development in autotetraploid a

热门文章

  1. Hadoop(四)hdfs基本操作
  2. 建立局域网计算机应安装,两台电脑如何建立局域网
  3. 记录:注意Unity返回的所有数组,只是数组的副本
  4. 服务器间 存活状态,Shell脚本监控LVS后台服务器存活状态
  5. 景安服务器可以用小程序吗,微信又放大招,无网环境也能使用小程序!
  6. chart.js 饼图显示百分比_Excel制作华夫饼图,其实很简单
  7. html z-dext优先级顺序,$ext{1D/1D}$ 动态规划的三种优化
  8. android 表情删除,微信8.0版本为什么删除30多个表情?旧表情删除原因说明[多图]...
  9. html5制作拼图游戏教程,用HTML5制作视频拼图的教程
  10. 以下哪些组件是Oracle,Oracle考试题1参考