HarmonyOS鸿蒙Next中读取本机通讯录,如何显示通讯录的头像?

HarmonyOS鸿蒙Next中读取本机通讯录,如何显示通讯录的头像? 申请权限,读取了本地通讯录,获取到的用户头像是如下格式:

“portrait”:{“uri”:“photo/2_2”},如何将这个uri头像显示到Image上?

5 回复

通过文档查看

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#contactquerycontactdeprecated7-4

cke_432.png

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才能显示。

核心步骤:

  1. 获取photoAccessHelper实例
  2. 使用getAssets接口查询相册资源
  3. 通过uri获取文件描述符FD
  4. 将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_CONTACTSohos.permission.READ_IMAGEVIDEO权限,并在应用配置文件中声明相册访问能力。

回到顶部