4

我使用以下代码将 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 个具有相同数据的联系人。

有任何想法吗?

4

2 回答 2

1

聚合仅适用于来自不同帐户的插入联系人。如果您插入来自同一帐户的两个原始联系人,它们将不会被聚合。

于 2013-02-13T17:55:23.923 回答
0

嗨@nr1,我在向现有联系人添加自定义类型的类似代码时遇到了同样的问题,我意识到如果您向联系人添加两次相同的数据,它就会分开。

正如API 文档所说:

自动聚合不是永久的;组成原始联系人的任何更改都可能创建新的聚合或分解现有的聚合。

我不知道为什么,但它总是这样,如果你这样做更多次,就会创建更多带有数据的空联系人(在我的情况下)。

我现在查看联系人是否已经存在,因此不会再次添加自定义数据。

于 2012-05-31T16:49:49.373 回答