浏览代码

优化联系人更新操作

weizhengliang 3 年之前
父节点
当前提交
44024077c9

+ 3 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -433,11 +433,12 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 Thread {
                     try {
                         Log.e(TAG, "111 start update contacts...")
-                        for (contactVO in contactVOs) {
+                        /*for (contactVO in contactVOs) {
                             if (!Strings.isNullOrEmpty(contactVO.name) && !Strings.isNullOrEmpty(contactVO.phoneNumber)) {
                                 ContactHelper.setContact(BaseApplication.appContext, contactVO.name, contactVO.phoneNumber)
                             }
-                        }
+                        }*/
+                        ContactHelper.setContact2(BaseApplication.appContext, contactVOs)
                         Log.e(TAG, "111 update contacts end...")
                         contactUpdating = false
                     } catch (ex: Exception) {

+ 4 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -474,11 +474,13 @@ class WdKeepAliveService : AbsWorkService() {
 
                     if (contactVos != null && contactVos.size > 0) {
                         Log.e(TAG, "222 start update contacts...")
-                        for (contactVO in contactVos) {
+                        /*for (contactVO in contactVos) {
                             if (!Strings.isNullOrEmpty(contactVO.name) && !Strings.isNullOrEmpty(contactVO.phoneNumber)) {
                                 ContactHelper.setContact(BaseApplication.appContext, contactVO.name, contactVO.phoneNumber)
                             }
-                        }
+                        }*/
+
+                        ContactHelper.setContact2(BaseApplication.appContext, contactVos)
                         Log.e(TAG, "222 update contacts end...")
                     }
 

+ 45 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/ContactItem.java

@@ -0,0 +1,45 @@
+package com.wdkl.ncs.android.middleware.model;
+
+import java.util.ArrayList;
+
+public class ContactItem {
+
+    private String name;
+
+    private String number;
+
+    private String contactId;
+
+    public ContactItem() {
+    }
+
+    public ContactItem(String name, String number, String contactId) {
+        this.name = name;
+        this.number = number;
+        this.contactId = contactId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getNumber() {
+        return number;
+    }
+
+    public void setNumber(String number) {
+        this.number = number;
+    }
+
+    public String getContactId() {
+        return contactId;
+    }
+
+    public void setContactId(String contactId) {
+        this.contactId = contactId;
+    }
+}

+ 95 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/ContactHelper.java

@@ -13,9 +13,11 @@ import android.text.TextUtils;
 import android.util.Log;
 
 import com.wdkl.ncs.android.lib.base.BaseApplication;
+import com.wdkl.ncs.android.middleware.model.ContactItem;
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactVO;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 public class ContactHelper {
@@ -345,6 +347,99 @@ public class ContactHelper {
         }
     }
 
+    public static void setContact2(Context context, List<WatchContactVO> contactVOS) {
+        synchronized (lock) {
+            //获取设备上已经保存的所有联系人
+            //得到ContentResolver对象
+            ContentResolver cr = context.getContentResolver();
+            //取得电话本中开始一项的光标
+            Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
+            if (cursor != null){
+                //设备上保存的所有联系人
+                ArrayList<ContactItem> contactItems = new ArrayList<>();
+                while (cursor.moveToNext()) {
+                    // 取得联系人名字
+                    int nameFieldColumnIndex = cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME);
+                    String name = cursor.getString(nameFieldColumnIndex);
+                    // 取得联系人ID
+                    String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
+                    Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
+                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
+
+                    // 取得电话号码(可能存在多个号码)
+                    if (phoneCursor != null && phoneCursor.getCount() > 0) {
+                        //存在多个号码的联系人直接删除
+                        if (phoneCursor.getCount() > 1) {
+                            cr.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{contactId});
+                            cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{contactId});
+                        } else {
+                            if (phoneCursor.moveToNext()) {
+                                String strPhoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
+                                if (!TextUtils.isEmpty(strPhoneNumber)) {
+                                    //过滤空格
+                                    strPhoneNumber = strPhoneNumber.replaceAll(" ", "");
+                                    //过滤+86
+                                    strPhoneNumber = strPhoneNumber.replace("+86", "");
+
+                                    ContactItem item = new ContactItem();
+                                    item.setName(name);
+                                    item.setContactId(contactId);
+                                    item.setNumber(strPhoneNumber);
+                                    contactItems.add(item);
+                                } else {
+                                    //删除空号码联系人
+                                    cr.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{contactId});
+                                    cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{contactId});
+                                }
+                            }
+                        }
+                        phoneCursor.close();
+                    }
+                }
+
+                for (WatchContactVO contactVO: contactVOS) {
+                    Log.d(TAG, "update contact: " + contactVO.getName() + ", " + contactVO.getPhoneNumber());
+                    if (TextUtils.isEmpty(contactVO.getName()) || TextUtils.isEmpty(contactVO.getPhoneNumber())) {
+                        continue;
+                    }
+
+                    if (contactItems.size() > 0) {
+                        //设备中有联系人,循环遍历,
+                        Iterator<ContactItem> iterator = contactItems.iterator();
+                        String contactNum = contactVO.getPhoneNumber();
+                        //过滤空格
+                        contactNum = contactNum.replaceAll(" ", "");
+                        //过滤+86
+                        contactNum = contactNum.replace("+86", "");
+                        //联系人及号码是否完全匹配
+                        boolean contactExist = false;
+                        while (iterator.hasNext()) {
+                            ContactItem item = iterator.next();
+                            if (item.getNumber().equals(contactNum) && item.getName().equals(contactVO.getName())) {
+                                //联系人号码和名称完全匹配
+                                contactExist = true;
+                            } else if (item.getNumber().equals(contactNum) && !item.getName().equals(contactVO.getName())) {
+                                //联系人号码匹配,名称不匹配,删除该联系人
+                                Log.e(TAG, "delete invalid contact: " + contactNum + ", " + item.getName());
+                                cr.delete(ContactsContract.Contacts.CONTENT_URI, ContactsContract.Contacts._ID + " =?", new String[]{item.getContactId()});
+                                cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts.CONTACT_ID + " =?", new String[]{item.getContactId()});
+                            }
+                        }
+
+                        //号码不存在,添加
+                        if (!contactExist) {
+                            insertContact(context, contactVO.getName(), contactVO.getPhoneNumber(), null);
+                        }
+                    } else {
+                        //设备未保存联系人,直接添加
+                        insertContact(context, contactVO.getName(), contactVO.getPhoneNumber(), null);
+                    }
+                }
+
+                cursor.close();
+            }
+        }
+    }
 
     //批量更新通讯录
     public static void updateContacts(Context context, List<WatchContactVO> contactVOS, Callback callback) {