手機通訊錄備份代碼實現三

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章