【问题标题】:Save data for contacts adds a new one保存联系人数据添加一个新的
【发布时间】:2017-08-19 22:22:53
【问题描述】:

我正在开发一个应用程序,我需要在其中存储与联系人相关的数据。

我使用光标在recycleView 中列出联系人,每个itemView 都有一个星号按钮,用于将联系人设置为收藏(与系统不同)。

我设法将数据存储在ContactsContract.Data,这样做:

private void addContactData(long contactId, String displayName, boolean favorite) {

    // displayName same as the value for Contacts.DISPLAY_NAME_PRIMARY

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

    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, CUSTOM_ACCOUNT_TYPE)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, CUSTOM_ACCOUNT_NAME)
            .withValue(ContactsContract.RawContacts.CONTACT_ID, contactId)
            .build());

    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, displayName)
            .build());

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE, CustomData.CONTENT_ITEM_TYPE)
            .withValue(CustomData.IS_FAVORITE, favorite)
            .build());

    try {
        ContentProviderResult[] contentProviderResults = cr.applyBatch(ContactsContract.AUTHORITY, ops);
        return contactUri;
    } catch (RemoteException | OperationApplicationException e) {
        Log.e(getClass().getSimpleName(), e.getMessage(), e);
        return null;
    }
}

我遇到的问题是当两个联系人具有完全相同的名称 ej 时。如果我按下收藏按钮,“Tom”和“Tom”会添加第三个联系人,该联系人甚至会在设备联系人应用程序中列出。

一些搜索引导我添加更多数据来区分联系人:

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.NUMBER, phone)
            .build());
// OR

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email)
            .build());

它工作得很好,除非两个联系人中的字段相等。我需要做什么来避免这种行为,以及为什么 CONTACT_ID 不足以执行此类操作?

【问题讨论】:

    标签: android android-contacts


    【解决方案1】:

    您需要告诉 Android 将您刚刚创建的新 RawContact 与一些(一个或多个)现有 RawContacts 合并。

    您使用 AggregationException 表执行此操作,为每个这样的“链接”添加一行。

    见:https://stackoverflow.com/a/40869351/819355

    代码sn-p:

    Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI);
    builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
    builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact);
    builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, someExistingRawContact);
    ContentProviderOperation op = builder.build();
    

    【讨论】:

    • 谢谢,这可行,我唯一的问题是 SIM 卡联系人。我发现即使是像 WhatsApp 这样的应用程序也会添加联系人副本以供使用,所以我认为没有其他方法可以做到这一点。我正在寻找有关它的一些文档,但仍然没有,无论如何感谢您的帮助。
    • 是的,sim 联系人不能合并到其他联系人中,这是 sim 联系人协议的限制
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多