HarmonyOS鸿蒙Next中解决使用授权弹窗showAssetsCreationDialog保存图片到相册,预览界面存在空白方框问题,附带完整解决方式
HarmonyOS鸿蒙Next中解决使用授权弹窗showAssetsCreationDialog保存图片到相册,预览界面存在空白方框问题,附带完整解决方式
1. 使用showAssetsCreationDialog 弹窗保存图片的时候,预览界面是空白
鉴于解决方式零零散散的,解决起来很麻烦,很繁琐特此收集解决方式归整记录
2. 解决方式
2.1 需要使用 getUriFromPath() 方法把你要处理的沙箱路径包裹一下
let srcFileUri = fileUri.getUriFromPath(sandboxPath);
2.2 如果沙箱路径不正确,也会导致预览图出不来,关于沙箱路径的获取方式如下代码
async getSandboxPath(pixelMap: PixelMap, context: Context): Promise<string> {
// 获取应用文件路径
let filesDir: string = context.cacheDir;
let picName = '/tempImage' + new Date().getTime() + '.jpg';
// 新建并打开文件
let file = fs.openSync(filesDir + picName, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);
// 创建图像编码ImagePacker对象
const imagePackerApi = image.createImagePacker();
// 设置编码输出流和编码参数。format为图像的编码格式;quality为图像质量,范围从0-100,100为最佳质量
const options: image.PackingOption = { format: 'image/jpeg', quality: 98 };
await imagePackerApi.packToFile(pixelMap, file.fd, options);
return file.path;
}
2.3 弹窗打开同意授权保存沙箱照片到媒体
const sandboxPath = await PermissionUtils.getSandboxPath(this.pixelMap!, this.context);
// 获取相册的保存路径
let srcFileUri = fileUri.getUriFromPath(sandboxPath);
// 指定待保存到媒体库的位于应用沙箱的图片uri。
let srcFileUris: Array<string> = [
srcFileUri
];
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
// 将来源于应用沙箱的照片内容写入媒体库的目标uri。
let desFile: fileIo.File = await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY);
let srcFile: fileIo.File = await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY);
await fileIo.copyFile(srcFile.fd, desFile.fd);
fileIo.closeSync(srcFile);
fileIo.closeSync(desFile);
this.getUIContext().getPromptAction().showToast({ message: $r('app.string.saved_to_album') });
最终预览图正常显示
更多关于HarmonyOS鸿蒙Next中解决使用授权弹窗showAssetsCreationDialog保存图片到相册,预览界面存在空白方框问题,附带完整解决方式的实战教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,使用showAssetsCreationDialog
保存图片到相册时出现空白方框问题,可通过以下方式解决:
- 确保调用
showAssetsCreationDialog
前图片已完整加载 - 检查uri路径是否正确
- 在保存前调用
mediaLibrary.getFileAssets()
验证文件可访问性
示例代码:
let media = mediaLibrary.getMediaLibrary(context)
let fileAsset = await media.createAsset(mediaLibrary.MediaType.IMAGE, "test.jpg", uri)
// 确保uri有效后再调用弹窗
更多关于HarmonyOS鸿蒙Next中解决使用授权弹窗showAssetsCreationDialog保存图片到相册,预览界面存在空白方框问题,附带完整解决方式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
感谢分享这个完整的解决方案!针对HarmonyOS Next中使用showAssetsCreationDialog保存图片时预览界面出现空白方框的问题,您的方案确实提供了很好的解决思路。
关键点总结:
- 必须使用fileUri.getUriFromPath()方法处理沙箱路径
- 正确的沙箱路径获取方式很关键
- 完整的流程包括:创建临时文件->编码图像->获取URI->显示授权弹窗->保存到相册
这个方案很好地解决了预览空白的问题,同时也处理了文件权限和路径转换等常见痛点。代码结构清晰,包含了错误处理和用户反馈,是一个完整的实现方案。
对于遇到类似问题的开发者来说,这个方案可以直接参考使用,避免了零散查找解决方案的麻烦。特别是getUriFromPath()的使用和沙箱路径处理的部分,是解决问题的关键所在。