Android 联系人选择器提供了一个标准的隐私保护界面,可让用户与应用分享特定联系人。此功能在 Android 17 中引入,可作为无需权限的替代方案来替代广泛的 READ_CONTACTS 权限。
通过使用联系人选择工具,应用可以请求访问特定的联系人数据,例如电话号码或电子邮件地址。用户选择要分享的联系人,系统仅向应用授予对这些详细信息的临时读取权限。
架构
联系人选择工具包含两个主要组件:
- 选择器界面应用:此组件充当面向用户的联系人选择界面。
- 会话提供程序:此组件充当管理临时访问会话的后端服务。

图 1. 序列图
选择器界面
选择器界面负责处理联系人选择的用户界面,并直接查询联系人提供程序,以根据请求的数据类型填充视图。支持的视图包括:
- 仅限电话号码:界面会显示包含电话号码的联系人。
- 仅显示电子邮件地址:界面会显示包含电子邮件地址的联系人。
- 自定义联系信息:界面会显示与特定请求的数据字段匹配的联系人。
此外,该界面还支持以下功能:
- 按字母顺序排序的列表:联系人按字母顺序排序,并会进行去重处理。
- 联系人头像:界面会显示联系人照片或头像。
- 收藏夹:“收藏夹”类别显示在联系人列表的顶部。
- 资料切换器:借助此功能,用户可以选择来自不同用户资料(例如工作资料与私人资料)的联系人。
- 单选和多选:系统支持单选和多选模式(默认限制为 50,最大限制为 100)。
- 选择预览:用户可以在确认之前预览和管理所选联系人。
- 快速滚动:此功能可让您快速浏览联系人列表。
- 搜索:系统提供了一个搜索栏,用于查找特定联系人。
- 隐私权横幅和隐私权详情页面:强制性通知会准确告知用户应用正在请求哪些数据字段(例如电话号码、电子邮件地址)。
会话提供方
会话提供程序 (packages/providers/ContactsProvider) 充当客户端应用与联系人提供程序之间的安全中介。
- 角色:仅当您使用
Intent.ACTION_PICK_CONTACTS启动选择器时,才使用会话提供程序。 - 会话管理:当用户选择联系人时,选择器界面会将选择数据(映射到客户端的 UID)写入会话提供程序。
- 数据访问:提供程序向选择器返回
content://com.android.providers.contacts.picker.sessionsURI。 选择器会在将 URI 返回给客户端应用之前应用适当的读取标记。此 URI 会授予对用户所选特定数据字段的临时、精细读取访问权限,而不会公开所有联系人的数据。 - 特权访问:
android.permission.MANAGE_CONTACTS_PICKER_SESSION签名和特权权限可保护对会话提供程序的写入访问权限,确保只有受信任的系统选择器才能创建会话。
集成
硬件制造商和合作伙伴必须在搭载 Android 17 及更高版本的 build 中包含 Android 联系人选择工具。
支持的 intent
Intent.ACTION_PICK_CONTACTS:建议以 Android 17 及更高版本为目标平台的应用使用此 intent。Intent.ACTION_PICK:为保持向后兼容性而维护。系统会自动将这些请求路由到新的选择器,以选择支持的 MIME 类型(电子邮件、电话或联系人)。
会话管理
为了维护设备健康状况和隐私,会话提供程序会强制执行严格的数据清理政策:
- 清理作业:系统作业 (
CleanupJobService) 会定期运行,以移除超过 24 小时的会话数据。 - 行数限制:为防止存储空间使用量过大,会话提供程序表的上限为 5, 000 行。如果表达到此大小,系统会在插入新的会话数据之前自动剪除最旧的行。
- 持久保留:会话数据是瞬时数据。客户端应用应在收到返回的联系人数据后立即将其持久保留。
权限
对会话提供程序的写入访问权限需要 android.permission.MANAGE_CONTACTS_PICKER_SESSION 权限,该权限仅限于 Android 联系人选择工具软件包。
自定义和合规性
合作伙伴可以自定义字体和颜色等视觉元素,但实现必须遵守 Android CDD 第 3.18.2 节(待定)。
验证
合作伙伴必须使用兼容性测试套件 (CTS) 和 Google 移动服务测试套件 (GTS) 来验证其实现。