Автоматическое объединение контактов не работает при вставке нового контакта

Я вставляю 2 раза один и тот же контакт в эмулятор Android (2.3.3) с помощью следующего кода:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();

ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
   .withValue(RawContacts.AGGREGATION_MODE, RawContacts.AGGREGATION_MODE_DEFAULT)
   .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
   .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());

// structuredname
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
   .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
   .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Test")
   .withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "Tester")
   .withValue(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, "Test")
   .build());

// PHONE
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
   .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
   .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
   .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, "0")
   .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "12345678").build());

try {
  getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
} catch (RemoteException e) {
  e.printStackTrace();
} catch (OperationApplicationException e) {
  e.printStackTrace();
}

Согласно моему пониманию, Android обычно должен автоматически объединять контакты, делая одну запись из моих 2-х вставок. Однако этого не происходит, я вижу 2 контакта с одинаковыми данными в приложении для набора номера.

Есть идеи?

2 ответа

Агрегирование работает только для вставленных контактов из разных учетных записей. Если вы вставите два необработанных контакта из одной учетной записи, они не будут агрегированы.

Привет @nr1 У меня была та же проблема с похожим кодом, который добавил пользовательский тип к существующему контакту, и я понял, что если вы добавляете два раза одни и те же данные к контакту, он разделяется.

как гласит документация API:

Автоматическая агрегация не является постоянной; Любое изменение составляющего исходного контакта может создать новый агрегат или разрушить существующий.

Я не знаю почему, но это всегда так, если вы делаете это больше раз, создается больше пустых контактов с данными (в моем случае).

Я сейчас смотрю, если контакт уже существует, поэтому пользовательские данные не добавляются снова.

Другие вопросы по тегам