HarmonyOS 鸿蒙Next 为什么连续点击savebutton多次,只有第一次成功
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,这是为什么官方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。