0

0

MAUI怎么访问联系人信息 MAUI Contacts API用法

煙雲

煙雲

发布时间:2025-12-15 17:31:02

|

602人浏览过

|

来源于php中文网

原创

MAUI访问联系人需以用户主动选择为主,Windows不支持,iOS/Android需配置权限与描述字段;推荐用PickContactAsync()安全获取单个联系人,避免GetAllAsync()全量读取。

maui怎么访问联系人信息 maui contacts api用法

MAUI 访问联系人信息,核心靠 Microsoft.Maui.ApplicationModel.Communication.Contacts 命名空间提供的 API,但要注意:它不是“直接读取全部联系人”的万能接口,而是以**用户主动选择为主、平台能力为限**的设计逻辑。尤其在 Windows 上完全不支持选择联系人,iOS 和 Android 行为也有差异。

必须先配置平台权限和设置

不配好,PickContactAsync() 会静默失败或返回 null,连错误提示都不一定有。

  • Android:在 AndroidManifest.xml 中添加权限:;从 Android 6.0(API 23)起还需运行时请求授权(MAUI 会自动触发,但需确保用户点“允许”)
  • iOS / Mac Catalyst:在 Info.plist 中添加键 NSContactsUsageDescription,值为向用户说明“为什么需要访问通讯录”(例如:“用于邀请好友加入”),否则系统直接拒绝授权
  • Windows:官方明确不支持 PickContactAsync(),调用后直接返回 null,无回退方案

推荐方式:让用户手动选一个联系人

这是最稳定、兼容性最好、也最符合隐私规范的做法。调用 PickContactAsync() 会唤起系统原生联系人选择器,用户点选后返回结构化数据。

  • 代码里直接 await 调用,无需自己处理 UI 或权限弹窗(MAUI 封装了)
  • 返回的 Contact 对象包含 DisplayNameGivenNameFamilyNamePhonesList)、EmailsList)等字段
  • 如果用户取消或没选,结果是 null,务必判空再取属性,否则崩溃
  • 示例关键片段:
      var contact = await Contacts.Default.PickContactAsync();
      if (contact == null) return;
      string name = contact.DisplayName;
      string phone = contact.Phones.FirstOrDefault()?.Number ?? "";

谨慎使用:获取全部联系人列表

GetAllAsync() 理论上可拉取全部联系人,但实际限制多、性能差、且 iOS 上默认被禁用(需额外权限+用户授权+大量字段显式声明)。

Thiings
Thiings

免费的拟物化图标库

下载
  • iOS 必须先通过 CNContactStore 请求 .contacts 权限,并在 keysToFetch 显式列出要读的字段(如 CNContactGivenNameKey),否则返回空
  • Android 可能因联系人数量大而卡顿或 OOM,建议加限流或分页逻辑(MAUI 原生不支持分页)
  • 返回的是 IAsyncEnumerable,适合用 await foreach 遍历,别直接转 ListToArray
  • 多数场景下,真没必要全量读——优先用“选一个”满足核心需求

常见问题与避坑点

很多人写完发现 contact 总是 null,大概率卡在这几个地方:

  • 没在对应平台配置描述字段(iOS 的 NSContactsUsageDescription 缺失或为空)
  • Android 用户首次运行时点了“拒绝”,之后 MAUI 不再弹窗,需引导用户去系统设置里手动开启权限
  • 误以为 GetAllAsync() 在所有平台都可用,其实 Windows 完全不支持,iOS 默认只返回空集合
  • 在非主线程(比如后台任务)中调用 UI 相关 API,导致异常或无响应
  • 没检查 contact.Phonescontact.Emails 是否为空就直接取 [0],引发 IndexOutOfRangeException

基本上就这些。用好 PickContactAsync() + 做好平台适配,就能覆盖绝大多数联系人交互场景,不复杂但容易忽略细节。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

232

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

437

2024.03.01

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

757

2023.08.22

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

45

2025.12.04

pdf怎么转换成xml格式
pdf怎么转换成xml格式

将 pdf 转换为 xml 的方法:1. 使用在线转换器;2. 使用桌面软件(如 adobe acrobat、itext);3. 使用命令行工具(如 pdftoxml)。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1893

2024.04.01

xml怎么变成word
xml怎么变成word

步骤:1. 导入 xml 文件;2. 选择 xml 结构;3. 映射 xml 元素到 word 元素;4. 生成 word 文档。提示:确保 xml 文件结构良好,并预览 word 文档以验证转换是否成功。想了解更多xml的相关内容,可以阅读本专题下面的文章。

2087

2024.08.01

xml是什么格式的文件
xml是什么格式的文件

xml是一种纯文本格式的文件。xml指的是可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。想了解更多相关的内容,可阅读本专题下面的相关文章。

1028

2024.11.28

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 12.7万人学习

Java 教程
Java 教程

共578课时 | 49万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号