Контакты дублируются при добавлении необработанного контакта на основе номера телефона

Я пытаюсь добавить необработанные контакты для каждого из телефонных номеров, связанных со всеми контактами в списке контактов 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

введите здесь описание изображения


person muhsin ct    schedule 13.12.2017    source источник


Ответы (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);
person vikas kumar    schedule 13.12.2017
comment
Спасибо за ваш ответ. В моем случае проблема в дублировании контакта при добавлении необработанного контакта. Как и на приложенном снимке экрана, контакт с именем Aaaaaa продублирован, так как у него два телефонных номера. Здесь я пытаюсь добавить необработанные контакты для каждого номера телефона, связанного с Aaaaaa. - person muhsin ct; 13.12.2017