自定义联系人在 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 Contact
与 Hotmail
列表显示相同的 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);
}
似乎列表中的联系人总是聚合联系人(即使他们没有在地址簿中链接)。聚合联系人(显然)总是空 ContactListId
和 AggregateId
。 Id
-属性 始终匹配相应原始联系人的 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
.
我在 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 Contact
与 Hotmail
列表显示相同的 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);
}
似乎列表中的联系人总是聚合联系人(即使他们没有在地址簿中链接)。聚合联系人(显然)总是空 ContactListId
和 AggregateId
。 Id
-属性 始终匹配相应原始联系人的 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
.