연락처 선택

Windows.ApplicationModel.Contacts 네임스페이스를 통해 연락처를 선택할 수 있는 여러 옵션이 있습니다. 여기서는 단일 연락처 또는 여러 연락처를 선택하는 방법을 보여 주고, 앱에 필요한 연락처 정보만 검색하도록 연락처 선택기를 구성하는 방법을 보여 줍니다.

연락처 선택기 설정

Windows.ApplicationModel.Contacts.ContactPicker의 인스턴스를 만들어 변수에 할당합니다.

var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();

선택 모드 설정(선택 사항)

기본적으로 연락처 선택기는 사용자가 선택하는 연락처에 사용 가능한 모든 데이터를 검색합니다. SelectionMode 속성을 사용하면 앱에 필요한 데이터 필드만 검색하도록 연락처 선택기를 구성할 수 있습니다. 사용 가능한 연락처 데이터의 하위 집합만 필요한 경우에 연락처 선택기를 사용할 때 이 방법이 보다 효율적입니다.

먼저 SelectionMode 속성을 Fields로 설정합니다.

contactPicker.SelectionMode = Windows.ApplicationModel.Contacts.ContactSelectionMode.Fields;

그런 다음 DesiredFieldsWithContactFieldType 속성을 사용하여 연락처 선택기가 검색할 필드를 지정합니다. 이 예제에서는 이메일 주소를 검색하도록 연락처 선택기를 구성합니다.

contactPicker.DesiredFieldsWithContactFieldType.Add(Windows.ApplicationModel.Contacts.ContactFieldType.Email);

선택기 실행

Contact contact = await contactPicker.PickContactAsync();

사용자가 하나 이상의 연락처를 선택하게 하려면 PickContactsAsync를 사용합니다.

public IList<Contact> contacts;
contacts = await contactPicker.PickContactsAsync();

연락처 처리

선택기가 반환되면 사용자가 연락처를 선택했는지 여부를 검사합니다. 그런 경우 연락처 정보를 처리합니다.

이 예제에서는 단일 연락처를 처리하는 방법을 보여줍니다. 여기서 연락처의 이름을 검색하고 OutputName이라는 TextBlock 컨트롤에 이것을 복사합니다.

if (contact != null)
{
    OutputName.Text = contact.DisplayName;
}
else
{
    rootPage.NotifyUser("No contact was selected.", NotifyType.ErrorMessage);
}

이 예제에서는 여러 연락처를 처리하는 방법을 보여줍니다.

if (contacts != null && contacts.Count > 0)
{
    foreach (Contact contact in contacts)
    {
        // Do something with the contact information.
    }
}

전체 예제(단일 연락처)

이 예제에서는 연락처 선택기를 사용하여 이메일 주소, 위치 또는 전화 번호와 함께 단일 연락처의 이름을 검색합니다.

// ...
using Windows.ApplicationModel.Contacts;
// ...

private async void PickAContactButton-Click(object sender, RoutedEventArgs e)
{
    ContactPicker contactPicker = new ContactPicker();

    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.Email);
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.Address);
    contactPicker.DesiredFieldsWithContactFieldType.Add(ContactFieldType.PhoneNumber);

    Contact contact = await contactPicker.PickContactAsync();

    if (contact != null)
    {
        OutputFields.Visibility = Visibility.Visible;
        OutputEmpty.Visibility = Visibility.Collapsed;

        OutputName.Text = contact.DisplayName;

        AppendContactFieldValues(OutputEmails, contact.Emails);
        AppendContactFieldValues(OutputPhoneNumbers, contact.Phones);
        AppendContactFieldValues(OutputAddresses, contact.Addresses);
    }
    else
    {
        OutputEmpty.Visibility = Visibility.Visible;
        OutputFields.Visibility = Visibility.Collapsed;
    }
}

private void AppendContactFieldValues<T>(TextBlock content, IList<T> fields)
{
    if (fields.Count > 0)
    {
        StringBuilder output = new StringBuilder();

        if (fields[0].GetType() == typeof(ContactEmail))
        {
            foreach (ContactEmail email in fields as IList<ContactEmail>)
            {
                output.AppendFormat("Email: {0} ({1})\n", email.Address, email.Kind);
            }
        }
        else if (fields[0].GetType() == typeof(ContactPhone))
        {
            foreach (ContactPhone phone in fields as IList<ContactPhone>)
            {
                output.AppendFormat("Phone: {0} ({1})\n", phone.Number, phone.Kind);
            }
        }
        else if (fields[0].GetType() == typeof(ContactAddress))
        {
            List<String> addressParts = null;
            string unstructuredAddress = "";

            foreach (ContactAddress address in fields as IList<ContactAddress>)
            {
                addressParts = (new List<string> { address.StreetAddress, address.Locality, address.Region, address.PostalCode });
                unstructuredAddress = string.Join(", ", addressParts.FindAll(s => !string.IsNullOrEmpty(s)));
                output.AppendFormat("Address: {0} ({1})\n", unstructuredAddress, address.Kind);
            }
        }

        content.Visibility = Visibility.Visible;
        content.Text = output.ToString();
    }
    else
    {
        content.Visibility = Visibility.Collapsed;
    }
}

전체 예제(여러 연락처)

이 예제에서는 연락처 선택기를 사용하여 여러 연락처를 검색한 다음 OutputContacts라고 하는 ListView 컨트롤에 이들 연락처를 추가합니다.

MainPage rootPage = MainPage.Current;
public IList<Contact> contacts;

private async void PickContactsButton-Click(object sender, RoutedEventArgs e)
{
    var contactPicker = new Windows.ApplicationModel.Contacts.ContactPicker();
    contactPicker.CommitButtonText = "Select";
    contacts = await contactPicker.PickContactsAsync();

    // Clear the ListView.
    OutputContacts.Items.Clear();

    if (contacts != null && contacts.Count > 0)
    {
        OutputContacts.Visibility = Windows.UI.Xaml.Visibility.Visible;
        OutputEmpty.Visibility = Visibility.Collapsed;

        foreach (Contact contact in contacts)
        {
            // Add the contacts to the ListView.
            OutputContacts.Items.Add(new ContactItemAdapter(contact));
        }
    }
    else
    {
        OutputEmpty.Visibility = Visibility.Visible;
    }         
}
public class ContactItemAdapter
{
    public string Name { get; private set; }
    public string SecondaryText { get; private set; }

    public ContactItemAdapter(Contact contact)
    {
        Name = contact.DisplayName;
        if (contact.Emails.Count > 0)
        {
            SecondaryText = contact.Emails[0].Address;
        }
        else if (contact.Phones.Count > 0)
        {
            SecondaryText = contact.Phones[0].Number;
        }
        else if (contact.Addresses.Count > 0)
        {
            List<string> addressParts = (new List<string> { contact.Addresses[0].StreetAddress,
              contact.Addresses[0].Locality, contact.Addresses[0].Region, contact.Addresses[0].PostalCode });
              string unstructuredAddress = string.Join(", ", addressParts.FindAll(s => !string.IsNullOrEmpty(s)));
            SecondaryText = unstructuredAddress;
        }
    }
}

요약 및 다음 단계

지금까지 연락처 선택기를 사용하여 연락처 정보를 검색하는 기본적인 방법을 살펴보았습니다. GitHub에서 유니버설 Windows 앱 샘플을 다운로드하여 연락처 및 연락처 선택기를 사용하는 방법의 예를 더 확인해보세요.