HarmonyOS 鸿蒙Next保存图片到系统相册问题
HarmonyOS 鸿蒙Next保存图片到系统相册问题
const context = getContext(this) as common.UIAbilityContext;
const helper = photoAccessHelper.getPhotoAccessHelper(context);
const uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, ‘jpg’);
const file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
await fs.write(file.fd, buffer2)
await fs.close(file.fd)
尝试了申请文件权限使用photoPicker,但是只是存到自定义目录,不是系统相册。
保存图片到系统相册这个要怎么处理?
保存相册的场景,会提供一个native功能给h5页面调用,在h5页面上是不会使用到安全控件SaveButton的
更多关于HarmonyOS 鸿蒙Next保存图片到系统相册问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
可以参考下这篇博文:
HarmonyOS Next 屏幕截图 + 保存图片到系统相册 代码分享
https://developer.huawei.com/consumer/cn/blog/topic/03166979994620019
更多关于HarmonyOS 鸿蒙Next保存图片到系统相册问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
楼主您好,使用http模块下的request方法下载图片,并在该方法的回调函数中保存到相册 先申请以下权限: ohos.permission.INTERNET ohos.permission.WRITE_IMAGEVIDEO 其中ohos.permission.WRITE_IMAGEVIDEO需要向用户申请授权,可参考文档 向用户申请授权-申请应用权限-应用权限管控-程序访问控制-安全-系统 - 华为HarmonyOS开发者 (huawei.com)
保存网络图片代码如下:
import { http } from '@kit.NetworkKit'
import { BusinessError } from '@kit.BasicServicesKit';
import ResponseCode from '@ohos.net.http';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import fs from '@ohos.file.fs';
@Entry
@Component
struct Index {
loadImageWithUrl(url: string) {
// 使用request下载图片并在回调函数中保存图片到相册
http.createHttp().request(url,
{
method:http.RequestMethod.GET,
connectTimeout:60000,
readTimeout:60000
},
async (error: BusinessError, data: http.HttpResponse) => {
if (error) {
console.error(`http reqeust failed with. Code: ${error.code}, message: ${error.message}`);
} else {
if (ResponseCode.ResponseCode.OK === data.responseCode) {
let imageBuffer: ArrayBuffer = data.result as ArrayBuffer;
try {
// 获取相册路径
const context = getContext(this);
let helper = photoAccessHelper.getPhotoAccessHelper(context);
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg')
let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
// 写入文件
await fs.write(file.fd, imageBuffer);
// 关闭文件
await fs.close(file.fd);
} catch (error) {
console.error("error is "+ JSON.stringify(error))
}
} else {
console.error("error occurred when image downloaded!")
}
}
})
}
build() {
Row() {
Column() {
Button("点击下载并保存网络图片", {type: ButtonType.Capsule, stateEffect: false})
.width('100%')
.height(55)
.fontSize('15fp')
.fontColor('#ffffff')
.margin({top: 20})
.onClick(()=> {
this.loadImageWithUrl("https://copyright.bdstatic.com/vcg/creative/cc9c744cf9f7c864889c563cbdeddce6.jpg@h_1280")
})
}
.width('100%')
}
.height('100%')
}
}
保存本地图片到相册的方法
let context: Context = getContext(this);
// 获取待保存图像的ArrayBuffer
const resourceMgr: resourceManager.ResourceManager = context.resourceManager;
const fileData: Uint8Array = await resourceMgr.getRawFileContent('beer.jpeg');
const buffer = fileData.buffer;
// 获取相册的保存路径
let helper = photoAccessHelper.getPhotoAccessHelper(context);
let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpeg');
let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入文件并关闭文件流
await fs.write(file.fd, buffer);
await fs.close(file.fd);
在HarmonyOS鸿蒙Next中保存图片到系统相册,需通过几个关键步骤确保图片能被系统正确识别并添加到相册中。
首先,需从网络或本地资源下载图片,并将其保存到应用的沙箱存储中。这一步要确保图片已成功下载,并知晓其存储路径。
其次,通过媒体扫描让系统识别新添加的图片。HarmonyOS推荐使用其特定的文件存储和访问机制,同时支持部分Android标准API(视设备兼容层而定)。可尝试使用MediaStore相关API或MediaScannerConnection进行扫描,或者发送MediaScanner.SCAN_FILE_PATH广播(需设备兼容层支持)。
如果上述方法不适用,还可使用HarmonyOS提供的photoAccessHelper API,通过创建PhotoAsset对象并调用相关方法将图片添加到相册。注意,需申请必要的权限,如WRITE_IMAGEVIDEO和READ_IMAGEVIDEO。
确保应用具有读写存储权限,并检查图片是否真的未被系统识别。若问题依旧无法解决,请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。