HarmonyOS 鸿蒙Next 保存网络图片至本地,使用showAssetsCreationDialog时,授权弹框图片区域空白,点击保存能够成功保存至相册。这是什么原因?
HarmonyOS 鸿蒙Next 保存网络图片至本地,使用showAssetsCreationDialog时,授权弹框图片区域空白,点击保存能够成功保存至相册。这是什么原因?
//保存图片至相册
saveImageToLocal(dataStr:string){ let shareObj:object = JSON.parse(dataStr); let imgUrl:string = shareObj[“ImageUrl”]; let callbackFunction:string = shareObj[“callbackFunction”]; // 获取沙箱路径 let filesDir = getContext().filesDir;
try {
let fileName:string = util.generateRandomUUID(false);
// 将web页面的图片下载到沙箱路径
request.downloadFile(getContext(), {
url: imgUrl,
filePath: ${filesDir}/
+ fileName +’.png’
}).then((downloadTask: request.DownloadTask) => {
downloadTask.on(‘complete’, async () => {
Logger.info(‘download image succeed’);
// 下载成功后图片的沙箱路径
const srcFileUris: string[] = [${filesDir}/
+ fileName +’.png’];
await this.saveImage(srcFileUris,fileName,callbackFunction);
})
}).catch((err: BusinessError) => {
Logger.error(wq Invoke downloadTask failed, code is ${err.code}, message is ${err.message}
);
});
} catch (error){
Logger.error(download image failed, code is: ${error.code}, message is: ${error.message}
);
}
}
async saveImage(srcFileUris: Array<string>,fileName:string,callback:string) {
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(getContext());
try {
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
title: fileName,
fileNameExtension: ‘png’,
photoType: photoAccessHelper.PhotoType.IMAGE,
subtype: photoAccessHelper.PhotoSubtype.DEFAULT,
}
];
// 拉起授予权限的弹窗,获取将图片保存到相册的权限
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
Logger.info(‘showAssetsCreationDialog success, data is:’ + desFileUris);
// 转换为uri
let uri: string = fileUri.getUriFromPath(srcFileUris[0]);
// 打开沙箱路径下图片
const file: fs.File = fs.openSync(uri, fs.OpenMode.READ_WRITE);
// 读取沙箱路径下图片为buffer
const photoSize: number = fs.statSync(file.fd).size;
let arrayBuffer: ArrayBuffer = new ArrayBuffer(photoSize);
let readLength: number = fs.readSync(file.fd, arrayBuffer);
let imageBuffer: ArrayBuffer = buffer.from(arrayBuffer, 0, readLength).buffer;
try {
// 打开相册下路径
let fileInAlbum = await fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
// 写入相册
await fs.write(fileInAlbum.fd, imageBuffer);
// 关闭文件
await fs.close(file.fd);
await fs.close(fileInAlbum.fd);
Logger.info(‘save image succeed’);
// 图片保存成功后,删掉沙箱路径下图片
fs.unlinkSync(srcFileUris[0]);
if(StringUtil.isStringNotEmpty(callback)){
CommonConstant.webviewController.runJavaScript(callback+"()",
(error, result) => {
Logger.info(“error=”+error)
Logger.info(“result=”+result)
});
}
} catch (error) {
Logger.error(save image failed, code is: ${error.code}, message is: ${error.message}
);
}
} catch (err) {
Logger.error(showAssetsCreationDialog failed, errCode is: ${err.code}, message is: ${err.message}
);
}
}
更多关于HarmonyOS 鸿蒙Next 保存网络图片至本地,使用showAssetsCreationDialog时,授权弹框图片区域空白,点击保存能够成功保存至相册。这是什么原因?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
已解决:
系统的授权弹框必须用getUriFromPath转下,否则无法正常展示图片
```csharp
// 下载成功后图片的沙箱路径
const string[] srcFileUris = [fileDir + "/" + fileName +'.png'];
//系统的授权弹框必须用getUriFromPath转下,否则无法正常展示图片
const string[] srcFileUrisForDialog = [fileUri.getUriFromPath(fileDir) + "/" + fileName +'.png'];
更多关于HarmonyOS 鸿蒙Next 保存网络图片至本地,使用showAssetsCreationDialog时,授权弹框图片区域空白,点击保存能够成功保存至相册。这是什么原因?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html