手机通讯录备份代码实现三

前言

手机通讯录备份代码实现一和二的思路是通过
备份:
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

发布了277 篇原创文章 · 获赞 84 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/qq_26296197/article/details/103051071
今日推荐