Xamarin.Forms开发中如何获取联系人头像
Xamarin.Forms 获取带头像联系人的替代实现方案
Xamarin.Essentials 官方提供的 Contacts API 本身设计不包含头像字段返回,你可以选择以下几种方案实现带头像的联系人读取:
- 方案1:使用社区维护的 Xamarin.Contacts 第三方库
该库已经封装了各平台的联系人读取逻辑,原生支持返回头像数据。使用时先将 Xamarin.Contacts 包通过 NuGet 安装到共享项目和各平台项目中,再按平台要求配置权限:安卓端在AndroidManifest.xml中添加READ_CONTACTS权限,iOS 端在Info.plist中添加NSContactsUsageDescription权限描述。
参考使用代码:
var contactService = CrossContacts.Current; // 先请求读取权限 if (await contactService.RequestPermission()) { // 读取所有联系人 var allContacts = await contactService.GetContactsAsync(); foreach (var contact in allContacts) { // 直接通过Photo属性拿到头像流,可直接转为ImageSource使用 if (contact.Photo != null) { var avatarSource = ImageSource.FromStream(() => contact.Photo); } } }
- 方案2:自行实现平台特定服务,通过依赖注入调用
如果不想引入第三方依赖,可在共享项目定义联系人服务接口,分别在安卓、iOS端实现读取逻辑:
共享项目定义接口和数据模型:
public interface ICustomContactService { Task<List<CustomContact>> GetContactsWithAvatarAsync(); } public class CustomContact { public string Name { get; set; } public string Phone { get; set; } public ImageSource Avatar { get; set; } }
安卓端通过 ContentResolver 查询 ContactsContract.Data 表获取头像二进制数据转为ImageSource;iOS 端通过 CNContactStore 查询时指定 CNContactImageDataKey 字段获取头像数据,最后通过 DependencyService 注册平台实现,共享项目直接调用即可。
- 方案3:升级到MAUI后的原生方案
如果你后续有升级应用到MAUI的计划,MAUI 官方的 Contacts API 已经原生支持头像读取,直接访问Contact.Image属性即可拿到头像数据,不需要额外适配。
注意:所有方案都需要先主动申请联系人读取权限,获得用户授权后再执行读取操作,避免权限不足导致应用崩溃。
内容的提问来源于stack exchange,提问作者Nikita Burmistrov
相关产品推荐
相关产品推荐

