HarmonyOS 鸿蒙Next如何选取相册图片作为头像并在下次打开时仍然显示

发布于 1周前 作者 wuwangju 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next如何选取相册图片作为头像并在下次打开时仍然显示

请问如何选取相册里的图片,然后下次进入时仍然能显示出来?目前我是通过PhotoViewPicker去读取相册,然后获取到uri后保存到preferences里,但是下次打开时就不显示了。请求。

Image(this.avatarUri)
    .size({ width: 84, height: 84 })
    .margin({ top: 36 })
    .borderRadius(Number.MAX_VALUE)
    .onClick(async () => {
        let photoSelectResult = await this.photoPicker.select(this.photoSelectOptions)
        Log.debug(TAG,
            `PhotoViewPicker.select successfully, photoSelectResult uri: ${JSON.stringify(photoSelectResult)}`)
        this.avatarUri = photoSelectResult.photoUris[0]
        this.preferences.put('avatar_uri', photoSelectResult.photoUris[0]).then(() => {
            this.preferences.flush()
        })
    })
 
6 回复
我试了一下,API 11 保存了
file://media/Photo/102/IMG_1716172931_088/39ec09deda3a41d79e03897b0fdf68a0.jpeg

路径后,下次打开app加载这个地址是不显示图片的,可能是官方bug,还是拿到图片后马上上传到服务器吧。

Button('上传头像')
.onClick(async () => {
// 1. 选择图片
// 核心: 唤起相册app选择照片
// !控制将来选择照片的选项-图片-1
// 一、定义图片选择 Picker 的配置
// 实例化 选项对象
const photoSelectOptions = new picker.PhotoSelectOptions();
// 过滤选择媒体文件类型为IMAGE
photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
// 选择媒体文件的最大数目
photoSelectOptions.maxSelectNumber = 1;

// !调用picker身上的一个方法 拉起相册app 且传入选项 => 在then中获取用户选中的照片
// 二、创建 图片选择对象并选择图片
const photoViewPicker = new picker.PhotoViewPicker();
// 调用 select 方法,传入选项对象
const res = await photoViewPicker.select(photoSelectOptions)
const uri = res.photoUris[0]
// 2. 拷贝图片到缓存目录(要求你选好照片后 不能直接传服务器 需要先将上传的照片拷贝到一个临时的缓存目录中去)
// 核心: 拷贝刚刚选中的照片 放到一个目录中
// 三.将文件保存到缓存目录(只能上传在缓存目录中的文件)
const context = getContext(this)
const fileType = 'jpg' // 文件后缀名
// 生成一个新的文件名
const fileName = Date.now() + '.' + fileType // 1714790727597.jpg 时间戳为了保证文件名不重复
// 通过缓存路径+文件名 拼接出完整的路径
const copyFilePath = context.cacheDir + '/' + fileName
// 将文件 拷贝到 临时目录
const file = fs.openSync(uri, fs.OpenMode.READ_ONLY) // 以只读的方式打开你刚刚选中的照片
fs.copyFileSync(file.fd, copyFilePath) // 复制打开的照片 到缓存的文件夹中

// 3. 图片上传
let files: Array<request.File> = [

{
filename: fileName,
type: fileType,
name: 'img',
uri: `internal://cache/${fileName}`
}
]

request.uploadFile(context, {
url: '', // url 地址
method: http.RequestMethod.POST, // 请求方法
header: {
// 和接口文档的要求的格式对象
contentType: 'multipart/form-data',
},
files: files, // 文件信息
data: []
})
//开始上传
.then(res => {
//上传进度事件
res.on('progress', async (uploadedSize, totalSize) => {
this.message = `已上传${((uploadedSize / totalSize) * 100).toFixed(0)}%`
if (uploadedSize === totalSize) {
promptAction.showToast({ message: '上传成功' })
}
})
})
})

请问拿到了图片的uri之后怎么把图片保存并且显示在ui界面上呢,背景图

没问题呀,是不是虽然App启动后给avatarUri赋值了,但是重新安装没勾选Keep Application Data选项?

勾选了的,你可以试试,这样不行

在HarmonyOS鸿蒙Next系统中,若要实现选取相册图片作为头像并在下次打开时仍然显示,可以按照以下步骤操作:

  1. 图片选择:通过相册选择器(如PhotoViewPicker)从相册中选择图片。设置选择器参数,如媒体文件类型为图片(IMAGE_TYPE),并限制最大选择数量为1。
  2. 获取URI:选择图片成功后,获取图片的URI。该URI是图片的唯一标识符,用于后续的图片显示和处理。
  3. 保存URI:将获取的URI保存到应用的持久化存储中,如preferences或沙盒路径中的文件。确保保存路径和文件名是唯一的,以避免覆盖之前的数据。
  4. 加载显示:在需要显示头像的地方,从持久化存储中读取URI,并使用Image组件加载和显示图片。

如果在操作过程中遇到任何问题,导致图片无法正确显示,可以检查以下几个方面:

  • 确保URI保存和读取正确无误。
  • 检查图片加载逻辑是否正确实现。
  • 确认应用是否有读取存储和显示图片的权限。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部