HarmonyOS 鸿蒙Next 为什么连续点击savebutton多次,只有第一次成功

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 为什么连续点击savebutton多次,只有第一次成功

async saveImageToAlbum() {
// 目前没有权限,调用使用saveButton
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(YContext.get());
this.imageUri = fileUri.getUriFromPath(this.imageUri);
try {
let fileName = fs.openSync(this.imageUri).name
let array = fileName.split(’.’)
let createOption: photoAccessHelper.CreateOptions = {
title: ${array[<span class="hljs-number"><span class="hljs-number">0</span></span>]}_${<span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Date</span></span>().getTime()}
};
let photoUri = await phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, array[1], createOption);
let originFile = fs.openSync(this.imageUri, fs.OpenMode.READ_ONLY);
let file = fs.openSync(photoUri, fs.OpenMode.READ_WRITE);

fs.copyFileSync(originFile.fd, file.fd); fs.closeSync(originFile); fs.closeSync(file); phAccessHelper.release(); YToast.show($r(‘app.string.chat_save_image_success’)); } catch (err) { YToast.show($r(‘app.string.save_failed’)); YLog.i(TAG, [error][saveImageToAlbum]${err.code} ${err.message} ${err}); } }

点击saveButton,调用这个方法,只有第一次显示保存成功,后续报错,提示[error][saveImageToAlbum]13900002 No such file or directory Error: No such file or directory,这是为什么

3 回复
这个错误码是说文件不存在的问题,在每次获取到文件的地方打印看看,是否每次点击都会输出文件的路径,这边验证官方文档的saveButton,没有出现你说的这个问题

13900002错误码:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/errorcode-filemanagement-V5#section13900002-%E6%B2%A1%E6%9C%89%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E6%88%96%E7%9B%AE%E5%BD%95

官方svaeButton:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-security-components-savebutton-V5

错误码13900002通常意味着文件不存在,可能的原因是文件资源被释放或路径失效,this.imageUri可能在多次调用后变得无效
试下我的代码:

async saveImageToAlbum() {  
  // 增加文件存在性检查  
  if (!fs.accessSync(this.imageUri)) {  
    YToast.show('文件不存在');  
    return;  
  }  

let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(YContext.get());

try {
// 确保使用最新的URI this.imageUri = fileUri.getUriFromPath(this.imageUri);

<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> fileName = fs.openSync(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.imageUri).name;  
<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> array = fileName.split(<span class="hljs-string"><span class="hljs-string">'.'</span></span>);  

<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> createOption: photoAccessHelper.CreateOptions = {  
  title: `${array[<span class="hljs-number"><span class="hljs-number">0</span></span>]}_${<span class="hljs-keyword"><span class="hljs-keyword">new</span></span> <span class="hljs-built_in"><span class="hljs-built_in">Date</span></span>().getTime()}`  
};  

<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> photoUri = await phAccessHelper.createAsset(  
  photoAccessHelper.PhotoType.IMAGE,   
  array[<span class="hljs-number"><span class="hljs-number">1</span></span>],   
  createOption  
);  

<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> originFile = fs.openSync(<span class="hljs-keyword"><span class="hljs-keyword">this</span></span>.imageUri, fs.OpenMode.READ_ONLY);  
<span class="hljs-keyword"><span class="hljs-keyword">let</span></span> file = fs.openSync(photoUri, fs.OpenMode.READ_WRITE);  

fs.copyFileSync(originFile.fd, file.fd);  

<span class="hljs-comment"><span class="hljs-comment">// 确保文件描述符被正确关闭  </span></span>
fs.closeSync(originFile);  
fs.closeSync(file);  

YToast.show($r(<span class="hljs-string"><span class="hljs-string">'app.string.chat_save_image_success'</span></span>));  

} catch (err) {
YToast.show($r(‘app.string.save_failed’));
YLog.i(TAG, [error][saveImageToAlbum]${err.code} ${err.message} ${err});
} finally {
// 在finally中释放资源,确保资源总是被释放 phAccessHelper.release();
}
}

主要增加文件存在性检查,每次重新获取最新的文件URI,使用try-finally确保资源总是被释放。

有帮助的话点个关注哈

针对HarmonyOS 鸿蒙Next中连续点击SaveButton多次只有第一次成功的问题,这通常是由于防抖动功能未得到妥善处理。在鸿蒙系统中,为了防止因用户误操作或网络延迟导致的多次点击,系统往往会记录上次成功点击的时间戳,并与当前点击的时间戳进行比较,以确定是否发生了连续点击。

为了解决这个问题,开发者可以封装一个方法,通过比较两次点击的时间间隔来判断是否为连续点击,并据此决定是否执行相应的操作。此外,还需确保SaveButton的点击事件处理逻辑正确,且没有在其他地方(如网络请求或页面跳转)中引入导致多次执行的错误。

如果已尝试上述方法但问题依旧存在,可能是由于其他因素导致,如系统bug或特定环境下的兼容性问题。此时,建议详细检查代码逻辑,并确认是否所有相关组件和API都已正确使用。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部