联系人

浏览示例。 浏览示例

本文介绍如何使用 NET Multi-platform App UI (.NET MAUI) IContacts 接口选择联系人并阅读相关信息。

IContacts 接口的默认实现通过 Default 属性提供。 IContacts 接口和 Contacts 类都包含在 Microsoft.Maui.ApplicationModel.Communication 命名空间中。

重要说明

在 Windows 上,不支持选取联系人。

因为命名空间存在冲突,所以使用 iOS 或 macOS 时,Contacts 类型必须完全限定:Microsoft.Maui.ApplicationModel.Communication.Contacts。 新项目会自动以这些平台以及 Android 和 Windows 为目标。

如果要编写能在 iOS 和 macOS 上编译的代码,请完全限定 Contacts 类型。 或者,提供 using 指令,以便映射 Communication 命名空间:

using Communication = Microsoft.Maui.ApplicationModel.Communication;

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

开始使用

如果要访问联系人功能,需要设置下列特定平台。

需要具有 ReadContacts 权限,并且必须在 Android 项目中进行配置。 可以通过以下方法添加此权限:

  • 添加基于程序集的权限:

    打开 Platforms/Android/MainApplication.cs 文件,并在 using 指令后添加以下程序集特性:

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

    - 或 -

  • 更新 Android 清单:

    打开 Platforms/Android/AndroidManifest.xml 文件并在 manifest 节点中添加以下内容:

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

    - 或 -

  • 在清单编辑器中更新 Android 清单:

    在 Visual Studio 中,双击 Platforms/Android/AndroidManifest.xml 文件以打开 Android 清单编辑器。 然后,在所需权限下查看 READ_CONTACTS 权限。 这样会自动更新 AndroidManifest.xml 文件。

选取联系人

采用调用 PickContactAsync() 的方法可要求用户选择联系人。 设备上将出现联系人对话框,允许用户选择联系人。 如果用户没有选择联系人,则返回 null

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

        if (contact == null)
            return;
        
        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
    }
}

获取所有联系人

GetAllAsync 方法返回一个联系人集合。

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;
}

平台差异

本部分介绍特定平台与联系人 API 之间的差异。

  • 不支持 GetAllAsync 方法中的 cancellationToken 参数。