HarmonyOS鸿蒙Next中相册保存异常

HarmonyOS鸿蒙Next中相册保存异常 我在保存相册的时候,用到了phAccessHelper.showAssetsCreationDialog,他应该返回目标文件地址,但却返回了['-3006'],如附件截图所示。以下为引用的入口,具体方法在附件zip里

// 保存base64图片到相册 async jsSaveBase64ToNativeAlbum(base64Img: string): Promise<void> {
let dirPath = getContext(this).cacheDir;
let fileName = waybill${new Date().getTime()}.jpg;
if (fileIo.accessSync(${dirPath}/${fileName})) {
fileIo.rmdirSync(${dirPath}/${fileName});
}

SaveImageUtil  
    .saveImageToApplication(base64Img, dirPath, fileName)  
    .then((data) => {  
        if (0 == data.errorCode) {  
            SaveImageUtil  
                .saveImageToAlbum(`${dirPath}/${fileName}`, fileName)  
                .then((result) => {  
                    if (result) {  
                        showToast('保存图片到相册成功');  
                    } else {  
                        showToast('用户拒绝授权');  
                    }  
                })  
                .catch((error: BusinessError) => {  
                    showToast('保存图片到相册异常');  
                })  
        } else {  
            // 保存图片到应用沙盒失败,但提示如下  
            showToast('保存图片到相册异常');  
        }  
    })  
    .catch((error: BusinessError) => {  
        // 保存图片到应用沙盒异常,但提示如下  
        showToast('保存图片到相册异常');  
    })  

}


更多关于HarmonyOS鸿蒙Next中相册保存异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

您的问题可以参照如下demo:

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { fileIo, fileUri, picker } from '@kit.CoreFileKit';
import { buffer } from '@kit.ArkTS';
import fs, { ReadOptions, WriteOptions } from '@ohos.file.fs';

let context = this.getContext();
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

@Entry
@Component
struct phAccessHelperPage {
  @State src: string = 'https://syfrontweb.oss-cn-hangzhou.aliyuncs.com/wechat/small-mina/icon-account.png';
  @State base64: string = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAWCAYAAAArdgcFAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALXSURBVEhLrZVLSJRRFMdvZgUFvR+StVCsqKhpofmYZpTUXPSgCCKfqaTRqoheuGlh5TJauLFFEKZFgSBiGUFF0AOSgkxHSAqSdoL4CIr03//Md25+fXOxRR344ZV7zu/eOd/5ZgxiMaCwEMjP/+8YNDQ4NxIoKgJaWoDWVqC83J0TwKB4DxDlP7NRUgIMDuJ3TE4C9SfcuT4MIlzMRjHF/QNq1RgaBnr7gapad41iEOYij8jfILsd4ie9wK1u4PFrYGAIqK336h0Y5ETxB9lKAdv1wSeemgIuXQP21QBdz4CPX4Bxtmd8AqjhAbbOh0FmBHGyFFlHihPFp64CqbnApjBwoBQY/gpMT3v78gyO8QDrUgx2cCGElBxORR/7aUPEJ68AS7OBtZRvpDy0CzhaCYyMaBJjggeU1QHbuacYbOXCkknx+4C47jKwIAtYRvk6n1w+emVV4gGH2bYt3N8scvmYghS9fKNZDBEfp3hOpieXm0tb/HKZiupqYHRUixijY9zbC2wIU57OZCHEyfDHjQ7AUByX7+TNczw5i7DNJ5cXprFRizSamoE0ka/PQ5w0Jk9+011G7DOwmhNjb27bInLpaTafj8gLCoCeHi3SqDjDi+RRnsICS+XZmQmQ6OMcp/AAkS/Rtli5jG2U4s5OTdZo7wLWMI8YrOTHtawg5ecSD0jlAdJzuXmGynN566C4jWJxLPcw8RsFKTuv2Rrv+M2ZzgNsW2RkOwLiVoqldvEMBou4CLKQVPDbUuInp2ZsHHj0guPKhy43v33f27PR/sCrCWDik+Bnvl2zz6UXKebrHftE+SvgehvQ/VSNGnf5MON1zA9gkMzFbOw/DTx/yzZQOsAJ8scdipMpnss8BwZJHDWLjJ2LIxfU5ov2h6yhxJWvGGQc9F6Wv3GIYyrfghLN91hMsSvPh0HTTeeGkyS2YB7HzLXnwOD7D75l/MlybP4Tq4rwC42denLaEHw7AAAAAElFTkSuQmCC';
  @State isDownload: boolean = false;
  @State total: number = 0;
  @State value: number = 0;

  build() {
    Column() {
      Image(this.base64).height(100).width(100);
      Button('保存').onClick(() => {
        this.saveImage(this.base64);
      });
      if (this.isDownload) {
        Progress({ value: this.value, total: this.total, type: ProgressType.Linear }).margin({ top: 20 });
      }
    }
    .align(Alignment.BottomEnd)
    .width('100%')
    .height('100%')
    .backgroundColor(Color.White);
  }

  saveBase64Image(base64Str: string) {
    // 文件保存路径
    let uri = '';
    try {
      let PhotoSaveOptions = new picker.PhotoSaveOptions();
      // 保存图片默认名称
      PhotoSaveOptions.newFileNames = ['test.png'];
      let photoPicker = new picker.PhotoViewPicker();
      // 调起系统的图片保存功能
      photoPicker.save(PhotoSaveOptions).then((PhotoSaveResult) => {
        uri = PhotoSaveResult[0];
        // 获取图片的base64字符串
        let imageStr = base64Str.split(',')[1];
        // 打开文件
        let file = fs.openSync(uri, fs.OpenMode.READ_WRITE);
        // base64字符串转成buffer
        const decodeBuffer = buffer.from(imageStr, 'base64').buffer;
        // 写入文件
        fs.writeSync(file.fd, decodeBuffer);
        // 关闭文件
        fs.closeSync(file);
      }).catch((err: Error) => {
        console.error(err + '');
      });
    } catch (e) {
      console.error(e);
    }
  }

  // 保存图片
  async saveImage(imageURL: string) {
    try {
      let content = imageURL.split(',')[1];
      let dirPath: string = context.cacheDir;
      let fileName = 'test.jpg';
      
      // 检查文件是否存在
      fileIo.access(`${dirPath}/${fileName}`).then(async (result: boolean) => {
        if (result) {
          this.total = 0;
          this.value = 0;
          await fileIo.unlink(`${dirPath}/${fileName}`);
        }
      });
      
      // 写入文件
      this.writeBufferToFile(dirPath, fileName, buffer.from(content, 'base64').buffer);
      let uri = fileUri.getUriFromPath(`${dirPath}/${fileName}`);
      let srcFileUris: Array<string> = [uri];
      
      let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
        {
          title: 'test',
          fileNameExtension: 'png',
          photoType: photoAccessHelper.PhotoType.IMAGE,
          subtype: photoAccessHelper.PhotoSubtype.DEFAULT,
        }
      ];
      
      let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
      if (desFileUris.length > 0) {
        for (let index = 0; index < desFileUris.length; index++) {
          this.copyFileContentTo(srcFileUris[0], desFileUris[index]);
        }
      }
    } catch (err) {
      console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
    }
  }

  writeBufferToFile(dirPath: string, fileName: string, buf: ArrayBuffer) {
    if (!fs.accessSync(dirPath)) {
      // 如果文件夹不存在,则先创建文件夹
      fs.mkdirSync(dirPath);
    }
    let file = fs.openSync(`${dirPath}/${fileName}`, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    fs.writeSync(file.fd, buf);
    fs.closeSync(file);
  }

  copyFileContentTo(srcFilePath: string, destFilePath: string) {
    let srcFile = fs.openSync(srcFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    let destFile = fs.openSync(destFilePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    
    // 读取源文件内容并写入至目的文件
    let bufSize = 4096;
    let readSize = 0;
    let buf = new ArrayBuffer(bufSize);
    let readOptions: ReadOptions = { offset: readSize, length: bufSize };
    
    let readLen = fs.readSync(srcFile.fd, buf, readOptions);
    while (readLen > 0) {
      readSize += readLen;
      let writeOptions: WriteOptions = { length: readLen };
      fs.writeSync(destFile.fd, buf, writeOptions);
      readOptions.offset = readSize;
      readLen = fs.readSync(srcFile.fd, buf, readOptions);
    }
    
    // 关闭文件
    fs.closeSync(srcFile);
    fs.closeSync(destFile);
  }
}

更多关于HarmonyOS鸿蒙Next中相册保存异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


请问,该问题的原因是什么啊。下面的回答并没有说明问题的原因,按照下方的回答写,还是会出现这个问题

在HarmonyOS Next中,相册保存异常可能是由于多种原因导致的。首先,检查设备存储空间是否充足,存储空间不足可能导致保存失败。其次,确认相册应用权限是否完整,缺少必要的权限(如存储权限)会影响文件的保存。另外,系统或应用本身的Bug也可能引发此类问题,建议查看是否有系统更新或应用更新可供安装。最后,文件格式或路径问题有时也会导致保存异常,确保文件格式兼容且路径正确。如果问题持续,可以尝试重启设备或清除相册应用的缓存数据。

在HarmonyOS鸿蒙Next中,相册保存异常可能由以下原因导致:

  1. 存储空间不足:检查设备存储空间,确保有足够空间保存照片。
  2. 权限问题:确认相册应用已获取存储权限。
  3. 系统或应用故障:尝试重启设备或更新系统版本。
  4. 文件损坏:检查文件是否损坏或格式不支持。
  5. 第三方应用冲突:卸载近期安装的第三方应用,排除冲突。

建议根据具体情况进行排查,如问题持续,可联系华为客服获取进一步支持。

回到顶部