如何从 UWP 中的联系人获取生日?

How to get birthdays from Contacts in UWP?

我想创建一个简单的应用程序来获取联系人的出生日期。下面我已经实现了一些代码,但我不知道到底发生了什么。

var contactPicker = new ContactPicker();
    contactPicker.CommitButtonText = "Select";
    contactPicker.SelectionMode = ContactSelectionMode.Fields;
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.Email);

    var contacts = await contactPicker.PickContactsAsync();
    if (contacts != null && contacts.Count > 0)
    {
        try
        {
            foreach (Contact contact in contacts)
            {
                var birthday = contact.ImportantDates.First(d => d.Kind == 
                      ContactDateKind.Birthday);
                textBlock.Text = birthday.Day.ToString();

            }
        }
        catch (Exception w)
        {
            textBlock.Text = w.ToString();
        }                
    }

在上面的代码中,我成功地获取了电子邮件和姓名,但是我无法获取生日,因为没有可用的方法,例如 "contacts.birthday" 谢谢。

我捕获的异常是:

'System.InvalidOperationException' in  System.Linq.dll 
System.InvalidOperationException: Sequence contains no matching element at 
System.Linq.Enumerable.First[TSource](IEnumerable`1 source, Func`2
predicate) at ContactApiSample.MainPage.<button_Click>d__1.MoveNext()

似乎使用ContactPicker无法获取联系人的所有信息。 IList<ContactDate> ImportantDates 的计数始终为 0。

我刚刚为你的场景找到了一个解决方法,如果你坚持在这里使用 ContactPicker,你可以获取联系人的 ID,并使用此 ID 找到相同的联系人,但是来自 ContactStore 例如像这样:

if (contacts != null && contacts.Count > 0)
{
    try
    {
        ContactStore allAccessStore = await ContactManager.RequestStoreAsync(ContactStoreAccessType.AppContactsReadWrite);

        foreach (Contact contact in contacts)
        {
            var storecontact = await allAccessStore.GetContactAsync(contact.Id);
            var birthday = storecontact.ImportantDates.First(d => d.Kind ==
          ContactDateKind.Birthday);
        }
    }
    catch (Exception w)
    {
        //textBlock.Text = w.ToString();
    }
}