鸿蒙中 拍摄的照片同步到系统相册

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

鸿蒙(HarmonyOS)应用开发中,调用系统相机拍照后,默认不会自动保存到相册。如果需要将拍摄的照片同步到系统相册,需手动调用媒体库接口保存。

一、拍照后手动保存到相册的流程

1. 获取相机拍摄的图片文件

使用 @ohos.multimedia.camera 拍照后,得到临时文件路径(如 file://cache/temp_photo.jpg):

async function takePhoto() {
  // ...(前面的相机调用代码)
  const tempFilePath = getContext().cacheDir + '/temp_photo.jpg';
  await fs.write(tempFilePath, arrayBuffer); // 保存到应用缓存目录
  return tempFilePath;
}
2. 将临时文件保存到相册

使用 @ohos.file.mediaLibrary 将文件移动到相册目录:

import mediaLibrary from '@ohos.file.mediaLibrary';

async function saveToGallery(tempFilePath: string) {
  try {
    // 1. 获取媒体库实例
    const media = mediaLibrary.getMediaLibrary(getContext());

    // 2. 创建相册保存选项
    const fileKeyObj = mediaLibrary.FileKey;
    const imageType = mediaLibrary.MediaType.IMAGE;
    const publicPath = await media.getPublicDirectory(mediaLibrary.DirectoryType.DIR_IMAGE);

    // 3. 将临时文件移动到相册目录
    const displayName = `photo_${new Date().getTime()}.jpg`;
    const imageAsset = await media.createAsset(
      imageType,
      displayName,
      publicPath,
      tempFilePath // 源文件路径
    );

    console.info('已保存到相册:', imageAsset.uri);
    return imageAsset.uri;
  } catch (err) {
    console.error('保存到相册失败:', err);
  }
}

3. 在拍照流程中调用保存

async function takeAndSavePhoto() {
  const tempFilePath = await takePhoto();      // 拍照获取临时文件
  const galleryUri = await saveToGallery(tempFilePath); // 保存到相册
  return galleryUri; // 返回相册中的URI(如:file://media/Photos/photo_123456.jpg)
}

二、注意事项

  1. 权限要求
    • 保存到相册需要 ohos.permission.WRITE_IMAGEVIDEO 权限
    • 必须在 module.json5 中声明:
     "requestPermissions": [
       {
         "name": "ohos.permission.WRITE_IMAGEVIDEO",
         "reason": "将照片保存到相册"
       }
     ]
  1. 文件路径处理

    • 相册返回的URI格式为 file://media/Photos/xxx.jpg,可直接用于显示
    • 上传时需检查是否有读取权限(建议使用 fs.copy 保留原始文件)
  2. Android兼容性

    • 鸿蒙的媒体库API与Android不同,不可直接使用 MediaStore
  3. 临时文件清理

   // 上传完成后删除临时文件
   fs.unlink(tempFilePath).catch(() => {});

三、保存到相册的替代方案

如果不想使用媒体库API,也可直接通过文件操作保存到公共目录:

import fs from '@ohos.file.fs';

async function simpleSave(tempFilePath: string) {
  const publicPath = '/storage/emulated/0/Pictures/MyApp/';
  const destPath = publicPath + `photo_${Date.now()}.jpg`;
  
  await fs.copy(tempFilePath, destPath); // 复制文件
  return `file://${destPath}`;
}

 限制:此方法需要用户手动授权访问公共存储。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值