HarmonyOS 鸿蒙Next createAsset创建的图片在图库中找不到
HarmonyOS 鸿蒙Next createAsset创建的图片在图库中找不到
问题:使用photoAccessHelper.createAsset创建Asset后,使用fs将数据写入到对应的path中,设备的存储空间增长了,但是在图库中找不到对应的图片。
你写入的path是沙箱的路径吗,沙箱中的图片,图库是看不到的,需要使用安全保存控件SaveButton,或者拉起弹框保存api来保存图片,所以只涨了内存,图库看不到。下面的示例通过showAssetsCreationDialog来保存沙箱图片到图库中:
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { image } from '@kit.ImageKit';
import { resourceManager } from '@kit.LocalizationKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo, fileUri } from '@kit.CoreFileKit';
import { promptAction } from '@kit.ArkUI';
let context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
[@Entry](/user/Entry)
[@Component](/user/Component)
struct SaveImagePage {
[@State](/user/State) message: string = 'Hello World';
[@State](/user/State) pixelMap?: image.PixelMap = undefined
async aboutToAppear(): Promise<void> {
let decodingOptions: image.DecodingOptions = {
editable: true,
desiredPixelFormat: 3,
}
const rawFileDescriptor: resourceManager.RawFileDescriptor = await getContext(this).resourceManager.getRawFd('img.png');
const imageSource: image.ImageSource = image.createImageSource(rawFileDescriptor);
this.pixelMap = await imageSource.createPixelMap(decodingOptions)
}
build() {
Column(){
Image(this.pixelMap).width(200).height(200)
Button('保存').onClick(async () =>{
try {
const imagePackerApi: image.ImagePacker = image.createImagePacker();
let packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 }
let filePath = context.filesDir + "/" + Date().toString() + "_img.png"
imagePackerApi.packing(this.pixelMap, packOpts, (err: BusinessError, data: ArrayBuffer) => {
let file = fileIo.openSync(filePath,fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
fileIo.writeSync(file.fd,data)
})
let uri = fileUri.getUriFromPath(filePath);
let srcFileUris: Array<string> = [
uri // 实际场景请使用真实的uri
];
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
// title: 'test', // 可选
fileNameExtension: 'png',
photoType: photoAccessHelper.PhotoType.IMAGE,
subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
}
];
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
let imageFile = fileIo.openSync(desFileUris[0],fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);
await fileIo.copyFile(filePath,imageFile.fd,0).then(() =>{
promptAction.showToast({
message:"下载成功,已保存到相册"
})
})
await fileIo.close(imageFile.fd)
console.info('showAssetsCreationDialog success, data is ' + desFileUris);
} catch (err) {
console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}
})
}
}
}
保存安全控件:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-security-components-savebutton-V5
拉起弹框保存api:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog12
更多关于HarmonyOS 鸿蒙Next createAsset创建的图片在图库中找不到的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
createAsset返回的应该不是沙箱路径?我申请了ohos.permission.WRITE_IMAGEVIDEO,应该不需要SaveButton
在HarmonyOS鸿蒙系统中,使用createAsset
方法创建的图片如果在图库中找不到,通常是因为该图片没有被正确地添加到系统的媒体库或者存储路径不在图库扫描的范围内。
HarmonyOS的媒体库管理通常依赖于系统对特定目录的扫描和索引。如果图片存储在私有目录或其他非标准媒体目录下,系统可能不会自动将其添加到图库中。解决这个问题的一种方法是确保图片存储在公共媒体目录下,如“Pictures”或“DCIM”,并且文件名和格式符合系统的媒体识别规则。
此外,可以通过调用系统的媒体扫描接口,主动触发对特定目录或文件的扫描,以确保新创建的图片能够被图库应用识别并显示。这通常涉及到调用系统提供的API来请求媒体扫描服务。
还有一种可能是权限问题,确保应用具有读写外部存储或特定媒体目录的权限,否则即使图片被正确创建和存储,也可能因为权限不足而无法被图库访问。
如果以上方法都未能解决问题,可能是由于系统配置或版本特性导致的。此时,可以尝试重启设备,或者检查是否有相关的系统更新。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html