自定义联系人在 Windows Universal 上的 ContactListId 无效

Custom contact has invalid ContactListId on Windows Universal

我在 Windows 通用联系人 API 中遇到一些奇怪的行为。考虑以下方法:

public async Task TestContactStore()
{
    //Fetch store and create custom contact list
    ContactStore localStore = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);
    var list = await localStore.CreateContactListAsync("Contact Store Test");

    //Create new contact in custom contact list
    await list.SaveContactAsync(new Contact() { Name = "Test", LastName = "Contact"});

    ContactStore allAccessStore = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AllContactsReadOnly);

    //Print all available contact lists
    Debug.WriteLine("All Contact Lists");
    var contactLists = await allAccessStore.FindContactListsAsync();
    foreach (var contactList in contactLists)
    {
        Debug.WriteLine(contactList.DisplayName + ": " + contactList.Id);
    }
    //Print all available contacts
    Debug.WriteLine("All Contacts");
    var contacts = await allAccessStore.FindContactsAsync();
    foreach (var contact in contacts)
    {
        Debug.WriteLine(contact.Name + " " + contact.LastName + ": " + contact.ContactListId);
    }
}

它为我的应用创建了一个联系人列表 ("Contact Store Test")。然后它将一个新联系人保存到此列表 ("Test Contact")。在此之后它会打印所有可用的联系人列表,然后是所有联系人。

输出为:

All Contact Lists
Hotmail: 24,5,5
Contact Store Test: 24,11,11
All Contacts
Hotmail Contact: 24,5,5
Test Contact: 24,5,5

为什么 Test ContactHotmail 列表显示相同的 ContactListId?在 phone 的联系人应用程序中,它显示为属于 Contact Store Test 列表。我错过了什么?

我现在对这种行为做了一些进一步的研究。在最新版本 10.0.10512.1000 中,此行为已更改。现在所有 ContactListId return 空字符串。

按照上面示例中的方式获取联系人时

var contactLists = await allAccessStore.FindContactListsAsync();
foreach (var contact in contactLists)
{
    Debug.WriteLine(contactList.DisplayName + ": " + contactList.Id);
}

似乎列表中的联系人总是聚合联系人(即使他们没有在地址簿中链接)。聚合联系人(显然)总是空 ContactListIdAggregateIdId-属性 始终匹配相应原始联系人的 AggregateId-属性。 要获取相应的联系人列表 ID,需要获取该聚合的原始联系人:

var contactLists = await allAccessStore.FindContactListsAsync();
foreach (var contact in contactLists)
{
    var rawContacts = await allAccessStore.AggregateContactManager.FindRawContactsAsync(aggregateContact);
    foreach (var raw in rawContacts)
    {
        Debug.WriteLine(contactList.DisplayName + ": " + contactList.Id);
    }
}

这给出了预期的 ContactListId.