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

2 回复
已解决:


系统的授权弹框必须用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


在HarmonyOS鸿蒙Next中,使用showAssetsCreationDialog保存网络图片至本地时,授权弹框图片区域空白但点击保存仍能成功保存至相册,可能是由于以下原因:

  1. 图片加载问题:网络图片未能在弹框中正确加载,可能是图片URL无效或网络请求超时。尽管图片未显示,但系统仍能通过URL获取图片数据并保存。

  2. 权限问题:应用可能未正确请求或获取显示图片的权限,导致图片无法渲染在弹框中。

  3. UI渲染异常:弹框的UI组件可能存在渲染问题,导致图片无法正确显示。

  4. 缓存问题:图片可能已被缓存,但弹框未能正确读取缓存数据。

  5. 系统或API限制:鸿蒙系统的某些API在特定情况下可能限制图片的显示,但不影响保存操作。

这个问题可能与网络请求、权限管理或UI渲染机制相关,需要进一步调试以确定具体原因。

回到顶部