This article describes how you can use the .NET Multi-platform App UI (.NET MAUI) IContacts interface to select a contact and read information about it.

The default implementation of the IContacts interface is available through the Default property. Both the IContacts interface and Contacts class are contained in the Microsoft.Maui.ApplicationModel.Communication namespace.


Picking a contact is unsupported on Windows.

Because of a namespace conflict, the Contacts type must be fully qualified when targeting iOS or macOS: Microsoft.Maui.ApplicationModel.Communication.Contacts. New projects automatically target these platforms, along with Android and Windows.

To write code that will compile for iOS and macOS, fully qualify the Contacts type. Alternatively, provide a using directive to map the Communication namespace:

using Communication = Microsoft.Maui.ApplicationModel.Communication;

// Code that uses the namespace:
var contact = await Communication.Contacts.Default.PickContactAsync();

Get started

To access the Contacts functionality the following platform-specific setup is required.

The ReadContacts permission is required and must be configured in the Android project. This can be added in the following ways:

  • Add the assembly-based permission:

    Open the Platforms/Android/MainApplication.cs file and add the following assembly attribute after using directives:

    [assembly: UsesPermission(Android.Manifest.Permission.ReadContacts)]

    - or -

  • Update the Android Manifest:

    Open the Platforms/Android/AndroidManifest.xml file and add the following in the manifest node:

    <uses-permission android:name="android.permission.READ_CONTACTS" />

Pick a contact

You can request the user to pick a contact by calling the PickContactAsync() method. A contact dialog will appear on the device allowing the user to select a contact. If the user doesn't select a contact, null is returned.

private async void SelectContactButton_Clicked(object sender, EventArgs e)
        var contact = await Contacts.Default.PickContactAsync();

        if (contact == null)
        string id = contact.Id;
        string namePrefix = contact.NamePrefix;
        string givenName = contact.GivenName;
        string middleName = contact.MiddleName;
        string familyName = contact.FamilyName;
        string nameSuffix = contact.NameSuffix;
        string displayName = contact.DisplayName;
        List<ContactPhone> phones = contact.Phones; // List of phone numbers
        List<ContactEmail> emails = contact.Emails; // List of email addresses
    catch (Exception ex)
        // Most likely permission denied

Get all contacts

The GetAllAsync method returns a collection of contacts.

public async IAsyncEnumerable<string> GetContactNames()
    var contacts = await Contacts.Default.GetAllAsync();

    // No contacts
    if (contacts == null)
        yield break;

    foreach (var contact in contacts)
        yield return contact.DisplayName;

Platform differences

This section describes the platform-specific differences with the contacts API.

  • The cancellationToken parameter in the GetAllAsync method isn't supported.