联系人
本文介绍如何使用 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
参数。