根据电话号码添加原始联系人时联系人重复

Posted

技术标签:

【中文标题】根据电话号码添加原始联系人时联系人重复【英文标题】:Contacts getting duplicated while adding raw contact based on phone number 【发布时间】:2018-05-27 02:19:59 【问题描述】:

我正在尝试为与 android 联系人列表中的所有联系人关联的每个电话号码添加原始联系人。当某些联系人有多个与之关联的电话号码时,android 联系人列表会多次显示同一个联系人。我想汇总那些新添加的原始联系人(基于电话号码)并显示在该联系人下。

我所做的是,我使用下面的 URI ContactsContract.Contacts.CONTENT_URI 查询列出设备中的所有联系人 再次使用URI查询执行上述查询返回的每个联系人的所有电话号码

ContactsContract.CommonDataKinds.Phone.CONTENT_URI

然后为每个联系人创建 ClsContactList class objects,其中包含联系人的显示名称和与该联系人关联的电话号码数组。最后,将这些对象添加到一个列表中,并为列表中的每个对象调用附加函数来创建原始联系人。

private static void addContact(Account account, ClsContactList ObjContact) 
    ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
    int rawContactInsertIndex = operationList.size();
    for (String phoneNumber : ObjContact.PhoneNumbers) 
        operationList.clear();
        //Creating raw contact
        ContentProviderOperation.Builder builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
        builder.withValue(RawContacts.ACCOUNT_NAME, account.name);
        builder.withValue(RawContacts.ACCOUNT_TYPE, account.type);
        builder.withValue(ContactsContract.RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT);
        //builder.withValue(RawContacts.SYNC1, ObjContact.getDisplay_name());
        operationList.add(builder.build());
        //INSERT NAME
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, ObjContact.getDisplay_name());
        operationList.add(builder.build());

        //INSERT MOBILE
        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
        builder.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); // Number of the person
        //builder.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
        operationList.add(builder.build());

        builder = ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI);
        builder.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, rawContactInsertIndex);
        builder.withValue(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/vnd.org.c99.SyncProviderDemo.profile");
        builder.withValue(ContactsContract.Data.DATA1, "VOIP Call ("+phoneNumber+")");
        builder.withValue(ContactsContract.Data.DATA2, "Dialer App");
        builder.withYieldAllowed(true);
        operationList.add(builder.build());
        try 
            mContentResolver.applyBatch(ContactsContract.AUTHORITY, operationList);
         catch (Exception e) 
            e.printStackTrace();
        
    
  

请查看随附的屏幕截图。提前谢谢了。

联系人详细信息活动中的原始联系人

Android 联系人列表中重复的联系人

【问题讨论】:

【参考方案1】:

你需要这样查询,通过比较mime类型来获取过滤后的数据。

ContactsContract.Data.MIMETYPE = StructuredPostal.CONTENT_ITEM_TYPE

Cursor cursor = cr.query(ContactsContract.Data.CONTENT_URI,
     null, null, ContacsContract.Data.MIMETYPE +  "='" + 
ContactsContract.StructuredPostal.CONTENT_ITEM_TYPE + "'", null);

【讨论】:

感谢您的回复。就我而言,问题是在添加原始联系人时重复联系人。如随附的屏幕截图所示,名为“Aaaaaa”的联系人重复了,因为它有两个电话号码。在这里,我尝试为与“Aaaaaa”关联的每个电话号码添加原始联系人。

以上是关于根据电话号码添加原始联系人时联系人重复的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7联系人号码空格不是空格[重复]

如何删除以编程方式添加新联系人时添加的 Android 联系人应用程序中的重复条目?

Phonegap 联系人。更新联系人时保存重复的电话号码

Android 联系人查询获取重复项

如何在应用程序中将联系人信息添加到通讯录中[重复]

如何很好地构建具有重复元素的表单