本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
鸿蒙(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)
}
二、注意事项
- 权限要求:
- 保存到相册需要
ohos.permission.WRITE_IMAGEVIDEO
权限 - 必须在
module.json5
中声明:
- 保存到相册需要
"requestPermissions": [
{
"name": "ohos.permission.WRITE_IMAGEVIDEO",
"reason": "将照片保存到相册"
}
]
-
文件路径处理:
- 相册返回的URI格式为
file://media/Photos/xxx.jpg
,可直接用于显示 - 上传时需检查是否有读取权限(建议使用
fs.copy
保留原始文件)
- 相册返回的URI格式为
-
Android兼容性:
- 鸿蒙的媒体库API与Android不同,不可直接使用
MediaStore
- 鸿蒙的媒体库API与Android不同,不可直接使用
-
临时文件清理:
// 上传完成后删除临时文件
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}`;
}
限制:此方法需要用户手动授权访问公共存储。