【问题标题】:How I can programmatically merge two different contacts?(Android)如何以编程方式合并两个不同的联系人?(Android)
【发布时间】:2016-10-01 09:26:11
【问题描述】:

我想以编程方式将具有不同联系信息的同名联系人合并为一个联系人到电话联系人列表。

我还检查了this link 并看到了这个answer

我使用了以下代码:

ContentValues cv = new ContentValues();
cv.put(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER);
cv.put(AggregationExceptions.RAW_CONTACT_ID1, 1);
cv.put(AggregationExceptions.RAW_CONTACT_ID2, 2);
getContentResolver().update(AggregationExceptions.CONTENT_URI, cv, null, null);

我也尝试过一种方法,首先获取列表中的所有联系人信息,然后删除所有联系人。之后,使用预定义的 contactId 添加一个包含我所拥有的所有信息的新联系人。这会删除所有联系人,但不会使用预定义的 contactId 添加新联系人。

你可以看到here

【问题讨论】:

  • @Kroltan 同意,投票关闭 + 我已标记为版主。
  • @Kroltan 标题中已经有了问题:联系人本身的合并。假设您有 2 个联系人,并且您想链接他们,就像在许多联系人应用程序上一样,该怎么做。他已经有 2 个联系人作为输入(标记为“1”和“2”)。由于使用普通API失败,他尝试通过自己修改联系人进行合并。为什么关门了?
  • @androiddeveloper 看我评论的日期。查看编辑历史。所有的细节都是后来添加的。当我发表评论时,问题更糟。此时,您应该将我的评论标记为已过时。
  • @Kroltan 好的,但是如果现在没问题,为什么它会保持关闭状态?
  • @androiddeveloper 因为没有 3k 或更多声望的人注意到它现在可以了。如果您有时间,请在SOCVR chat 中询问,您需要 5 个人和 3k+ 代表投票才能重新开放。

标签: android merge contacts


【解决方案1】:

我假设您已经获取了联系人并构建了合并两个联系人的逻辑。

假设您要手动合并两个联系人,其ContactsContract.RawContacts._IDmasterContactIdcontactId

现在您可以通过以下代码进行合并:

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

ops.add(ContentProviderOperation.newUpdate(ContactsContract.AggregationExceptions.CONTENT_URI)
    .withValue(ContactsContract.AggregationExceptions.TYPE, ContactsContract.AggregationExceptions.TYPE_KEEP_TOGETHER)
    .withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID1, masterContactId)
    .withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID2, contactId).build());

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

【讨论】:

  • 我试过这段代码@Shaishav,但我没有得到任何输出。手机中存在重复的联系人。
  • 发布您的代码。您如何获取联系人列表和其他内容?
  • “masterContactId”是指它的查找键吗?你能发布一些额外的代码吗?您如何将多个联系人链接在一起?
  • masterContactId 表示第一个联系人的 id,contactId 是第二个联系人的 id。
  • 你能定义如何合并多个联系人吗?
【解决方案2】:

说明

https://developer.android.com/guide/topics/providers/contacts-provider
有 3 个表保存联系人的数据:

ContactsContract.Contacts
_ID = Unique Id
|----------------------------------|
| _ID | PHOTO_ID | PHOTO_URI | ... |
|----------------------------------|
|  1  | ...      | ...       | ... |
| ... | ...      | ...       | ... |
|----------------------------------|

ContactsContract.RawContacts
_ID        = Unique Id
CONTACT_ID = ContactsContract.Contacts._ID
|------------------------------------------------------|
| _ID | CONTACT_ID | ACCOUNT_NAME | ACCOUNT_TYPE | ... |
|------------------------------------------------------|
|  1  |     1      | +49012345678 | com.whatsapp | ... |
|  2  |     1      | xx@google.de | com.google   | ... |
|------------------------------------------------------|

ContactsContract.Data
_ID            = Unique Id
CONTACT_ID     = ContactsContract.Contacts._ID
RAW_CONTACT_ID = ContactsContract.RawContacts._ID
|-------------------------------------------------------------------|
| _ID | CONTACT_ID | RAW_CONTACT_ID | MIMETYPE | DATA1        | ... |
|-------------------------------------------------------------------|
|  1  |     1      |        1       | PHONE    | +49012345678 | ... |
|  2  |     1      |        2       | PHONE    | +49987654321 | ... |
|-------------------------------------------------------------------|

示例

假设您有 3 个 John Doe 的联系人。

  • 一个设备联系人
  • 一个 WhatsApp 联系人
  • 一个电报联系人
Device-Contact
_id    raw_contact_id  contact_id  account_type            mimetype                                                            data1                         data2             data3  
9856   1888            1916        com.htc.android.pcsc    vnd.android.cursor.item/name                                        John Doe                      John              Doe    
12259  1888            1916        com.htc.android.pcsc    vnd.android.cursor.item/phone_v2                                    +49 1511 0000000              2      

Telegram-Contact 
_id    raw_contact_id  contact_id  account_type            mimetype                                                            data1                         data2             data3          
11079  2253            2305        org.telegram.messenger  vnd.android.cursor.item/name                                        John Doe                      John              Doe            
11080  2253            2305        org.telegram.messenger  vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile  123456789                     Telegram Profile  +4915110000000 

WhatsApp-Contact
_id    raw_contact_id  contact_id  account_type            mimetype                                                            data1                         data2             data3                            
12254  2483            2543        com.whatsapp            vnd.android.cursor.item/name                                        John Doe                      John              Doe                             
12255  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.profile                    4915110000000@s.whatsapp.net  WhatsApp          Nachricht an +49 1511 0000000    
12256  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.voip.call                  4915110000000@s.whatsapp.net  WhatsApp          Sprachanruf an +49 1511 0000000  
12257  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.video.call                 4915110000000@s.whatsapp.net  WhatsApp          Videoanruf an +49 1511 0000000   
12258  2483            2543        com.whatsapp            vnd.android.cursor.item/phone_v2                                    +4915110000000                2                 null                             

那么下面的方法会合并这3个联系人:

private static void mergeContacts(ArrayList<Contact> contacts, ContentResolver contentResolver) {
    //make sure is sorted in ascending order.
    Collections.sort(contacts, (o1, o2) -> o1.getContactId().compareTo(o2.getContactId()));

    final String rawId = contacts.get(0).getRawContactId(); //ContactsContract.RawContacts._ID
    ArrayList<ContentProviderOperation> ops = new ArrayList<>();
    Contact currentContact;

    for (int index = 1; index < contacts.size(); ++index) {
        currentContact = contacts.get(index);
        ops.add(ContentProviderOperation.newUpdate(ContactsContract.AggregationExceptions.CONTENT_URI)
                .withValue(ContactsContract.AggregationExceptions.TYPE, ContactsContract.AggregationExceptions.TYPE_KEEP_TOGETHER)
                .withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID1, rawId)
                .withValue(ContactsContract.AggregationExceptions.RAW_CONTACT_ID2, currentContact.getRawContactId()).build());

        Log.d(TAG, "merge contacts: " + rawId + " - " + currentContact.getRawContactId());
    }

    if (!ops.isEmpty()) {
        try {
            ContentProviderResult[] result = contentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
            Log.d(TAG, "result: " + result.length);
        } catch (Exception e) {
            Log.e(TAG, e.toString(), e);
        }
    }
}
}

结果

这是合并后的联系人:

_id    raw_contact_id  contact_id  account_type            mimetype                                                            data1                         data2             data3                           
9856   1888            2543        com.htc.android.pcsc    vnd.android.cursor.item/name                                        John Doe                      John              Doe                            
12259  1888            2543        com.htc.android.pcsc    vnd.android.cursor.item/phone_v2                                    +49 1511 0000000              2                 null                            
11079  2253            2543        org.telegram.messenger  vnd.android.cursor.item/name                                        John Doe                      John              Doe                            
11080  2253            2543        org.telegram.messenger  vnd.android.cursor.item/vnd.org.telegram.messenger.android.profile  123456789                     Telegram Profile  +4915110000000                  
12254  2483            2543        com.whatsapp            vnd.android.cursor.item/name                                        John Doe                      John              Doe                            
12255  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.profile                    4915110000000@s.whatsapp.net  WhatsApp          Nachricht an +49 1511 0000000   
12256  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.voip.call                  4915110000000@s.whatsapp.net  WhatsApp          Sprachanruf an +49 1511 0000000 
12257  2483            2543        com.whatsapp            vnd.android.cursor.item/vnd.com.whatsapp.video.call                 4915110000000@s.whatsapp.net  WhatsApp          Videoanruf an +49 1511 0000000  
12258  2483            2543        com.whatsapp            vnd.android.cursor.item/phone_v2                                    +4915110000000                2                 null                            

【讨论】:

  • 老兄,这是我几个月前需要的一个惊人的解释。它可以节省我这么多小时的调查时间。很好解释:)
【解决方案3】:

如果您在 SQLite 数据库中插入所有联系人,那么您可以使用 SQLite 查询来获取同名联系人。

获取同名联系人后,从联系人列表中删除旧联系人,并从您的应用中添加具有合并详细信息的新联系人。

【讨论】:

  • 你在哪里坚持这个想法?
  • @pawneshwar 同时将联系人的详细信息合并为一个联系人并添加新联系人。
  • 你有合并细节吗?
猜你喜欢
  • 2016-12-26
  • 1970-01-01
  • 2017-02-23
  • 2012-02-24
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多