HarmonyOS 鸿蒙Next 通过 showAssetsCreationDialog API保存图片相册中无图片
HarmonyOS 鸿蒙Next 通过 showAssetsCreationDialog API保存图片相册中无图片
[js_context_utils.cpp:193]failed to create module context
使用这个示例后,我这边模拟器上显示这个问题,可能是什么原因?
真机再试一下呢
我们的这个接口的文档更新了,看下新代码是否可以保存到相册:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5#showassetscreationdialog12
您可以参考下面的demo,这个demo分两步,首先从用户相册选取图片到沙箱,然后再把沙箱中的图片保存到相册,showAssetsCreationDialog这个接口文档上面说用户同意保存后,返回已创建并授予保存权限的uri列表,该列表永久生效,应用可使用该uri写入图片/视频,还是需要把图片资源写到接口返回的uri中,参考demo如下:
import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { JSON } from '@kit.ArkTS';
@Entry
@Component
struct FileDemo {
@State message: string = '复制文件到应用沙箱路径';
copyFileDemo(){
let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 5;
let photoPicker = new photoAccessHelper.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
let file = fs.openSync(PhotoSelectResult.photoUris[0], fs.OpenMode.READ_ONLY)
let file2 = fs.openSync(getContext().filesDir+'/demo.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
fs.copyFileSync(file.fd, file2.fd)
fs.closeSync(file);
fs.closeSync(file2);
}).catch((err: BusinessError) => {
console.error('DocumentViewPicker.select failed with err: ' + JSON.stringify(err));
});
}
build() {
Column() {
Text(this.message)
.id('FileDemoHelloWorld')
.fontSize(50)
.fontWeight(FontWeight.Bold)
.alignRules({
center: { anchor: '__container__', align: VerticalAlign.Center },
middle: { anchor: '__container__', align: HorizontalAlign.Center }
})
.onClick(() => {
this.copyFileDemo()
})
Button('保存图片到相册')
.onClick(() => {
example()
})
}
.height('100%')
.width('100%')
}
}
async function example() {
console.info('ShowAssetsCreationDialogDemo.');
try {
// 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
let srcFileUris: Array<string> = [
getContext().filesDir + '/demo.jpg' // 实际场景请使用真实的uri
];
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
title: 'test2', // 可选
fileNameExtension: 'jpg',
photoType: photoAccessHelper.PhotoType.IMAGE,
subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
}
];
let context = getContext();
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
console.info('showAssetsCreationDialog success, data is ' + desFileUris);
try {
let file = fs.openSync(srcFileUris[0], fs.OpenMode.READ_ONLY)
let file2 = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
fs.copyFileSync(file.fd, file2.fd)
fs.closeSync(file);
fs.closeSync(file2);
} catch (e) {
console.log(JSON.stringify(e))
}
} catch (err) {
console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}
}
1.我们文档中对这个接口的解释是获取的uri列表永久生效;
2.使用该接口的时候,会向用问询是否同意保存相册权限,只有用户同意保存后,才会保存到相册,调用该接口保存相册,不需要再通过api向用户授权ohos.permission.READ_IMAGEVIDEO 和 ohos.permission.WRITE_IMAGEVIDEO这两个权限
针对您提到的HarmonyOS鸿蒙Next系统中通过showAssetsCreationDialog
API保存图片到相册但相册中无图片的问题,这通常可能由以下几个原因引起:
-
权限问题:确保应用已正确获取存储权限,包括读写外部存储的权限。在鸿蒙系统中,权限管理较为严格,未授权可能导致文件无法写入。
-
API使用不当:检查
showAssetsCreationDialog
API的调用参数是否正确,包括指定的文件路径、文件名及文件类型等。错误的参数可能导致文件保存失败。 -
系统缓存:有时系统缓存或相册应用本身的缓存可能导致新保存的图片未立即显示。尝试重启设备或相册应用查看是否解决。
-
文件路径问题:确认保存图片的路径是否在相册应用可扫描的范围内。如果路径不在默认相册扫描路径内,可能导致图片不显示。
-
系统或应用Bug:鸿蒙系统或相关应用可能存在未修复的Bug,导致文件保存异常。
请根据上述可能原因进行排查,确保所有设置正确无误。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。