HarmonyOS鸿蒙Next中读取本机通讯录,如何显示通讯录的头像?
HarmonyOS鸿蒙Next中读取本机通讯录,如何显示通讯录的头像? 申请权限,读取了本地通讯录,获取到的用户头像是如下格式:
“portrait”:{“uri”:“photo/2_2”},如何将这个uri头像显示到Image上?
通过文档查看
import { BusinessError } from '@kit.BasicServicesKit';
let promise = contact.queryContact('xxx', {
holderId: 1,
bundleName: "",
displayName: ""
}, {
attributes: [contact.Attribute.ATTR_NAME, contact.Attribute.ATTR_PHONE, contact.Attribute.ATTR_PORTRAIT]
});
promise.then((data) => {
console.info(`Succeeded in querying Contact. data->${JSON.stringify(data)}`);
}).catch((err: BusinessError) => {
console.error(`Failed to query Contact. Code: ${err.code}, message: ${err.message}`);
});
参考地址

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-contact#attribute
更多关于HarmonyOS鸿蒙Next中读取本机通讯录,如何显示通讯录的头像?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
这是在其他帖子看见的,不知道有没有效:
photo/2_2属于系统内部标识符,需通过Contacts模块的getContactPhoto方法转换为有效资源:
import { contacts } from '@kit.ContactsKit'; // 获取联系人数据后处理头像
let photoUri = contact.portrait.uri;
let pixelMap = contacts.getContactPhoto(context, photoUri);
将获取到的PixelMap对象直接赋值给Image组件:
Image()
.width(60)
.height(60)
.borderRadius(30)
.pixelMap(pixelMap) // 直接使用转换后的图像数据
.alt($r('app.media.default_avatar')) // 设置占位图
没有这个方法呀, contacts.getContactPhoto(context, photoUri),
在HarmonyOS Next中,使用@ohos.contact模块的Contact对象读取通讯录。通过contact.photo属性获取头像数据,该属性返回image.PixelMap类型。使用Image组件加载显示PixelMap,设置src属性为contact.photo即可渲染头像。确保应用已申请ohos.permission.READ_CONTACTS权限。
在HarmonyOS Next中,可以通过photoAccessHelper访问系统相册中的联系人头像。portrait.uri中的photo/2_2是联系人在系统相册中的相对路径,需要转换为完整URI才能显示。
核心步骤:
- 获取
photoAccessHelper实例 - 使用
getAssets接口查询相册资源 - 通过uri获取文件描述符FD
- 将FD转换为PixelMap并显示
示例代码:
import photoAccessHelper from '@ohos.file.photoAccessHelper';
import userFileManager from '@ohos.file.userFileManager';
// 获取photoAccessHelper实例
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
// 查询相册资源
let predicates = new dataSharePredicates.DataSharePredicates();
predicates.equalTo('relative_path', 'Contacts/');
let fetchOptions = {
fetchColumns: [],
predicates: predicates
};
try {
let fetchResult = await phAccessHelper.getAssets(fetchOptions);
let firstAsset = await fetchResult.getFirstObject();
// 获取文件描述符
let fd = await firstAsset.open('r');
// 创建ImageSource
let imageSource = image.createImageSource(fd);
let pixelMap = await imageSource.createPixelMap();
// 显示到Image组件
Image($r('app.media.icon'))
.width(100)
.height(100)
.pixelMap(pixelMap)
} catch (err) {
console.error('Failed to get contact portrait: ' + err);
}
注意:需要申请ohos.permission.READ_CONTACTS和ohos.permission.READ_IMAGEVIDEO权限,并在应用配置文件中声明相册访问能力。

