HarmonyOS 通过showAssetsCreationDialogAPI保存图片相册中无图片?

使用showAssetsCreationDialog保存图片,弹窗内白框不显示图片,点击保存相册中也没有图片。

参考代码来源:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-photoaccesshelper-V5\#showassetscreationdialog12

项目部分代码:

const imagePath: string = context1.filesDir + '/temp.jpg';
let imageUri = fileUri.getUriFromPath(imagePath)
console.log(`${imageUri}`)
try {
  // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
  let srcFileUris: Array<string> = [
    imageUri
  ];

  let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
    {
      title: 'testimage', // 可选
      fileNameExtension: 'jpg',
      photoType: photoAccessHelper.PhotoType.IMAGE,
      subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
    }
  ];
  let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context1);
  let dstFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
  console.info('show Assets Creation Dialog success, data is ' + dstFileUris);

} catch (e) {
  console.error(`show Assets Creation Dialog failed`);
  let err: BusinessError = e as BusinessError;
  console.log(`${err.code}, ${err.message}`);
}
阅读 496
1 个回答

可参考以下示例,总体分两步首先从用户相册选取图片到沙箱,然后再把沙箱中的图片保存到相册,showAssetsCreationDialog这个接口文档上面说用户同意保存后,返回已创建并授予保存权限的uri列表,该列表永久生效。应用可使用该uri写入图片/视频,需要把图片资源写到接口返回的uri中。

示例参考:

import { BusinessError } from '@kit.BasicServicesKit';
import { fileIo as fs } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { JSON } from '@kit.ArkTS';

@Entry
@Component
struct FileDemo {
  @State message: string = '复制文件到应用沙箱路径';

  copyFileDemo() {
    let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
    PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;
    PhotoSelectOptions.maxSelectNumber = 5;
    let photoPicker = new photoAccessHelper.PhotoViewPicker();
    photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
      let file = fs.openSync(PhotoSelectResult.photoUris[0], fs.OpenMode.READ_ONLY)
      let file2 = fs.openSync(getContext().filesDir + '/demo.jpg', fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
      fs.copyFileSync(file.fd, file2.fd)
      fs.closeSync(file);
      fs.closeSync(file2);
    }).catch((err: BusinessError) => {
      console.error('DocumentViewPicker.select failed with err: ' + JSON.stringify(err));
    });
  }

  build() {
    Column() {
      Text(this.message)
        .id('FileDemoHelloWorld')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .alignRules({
          center: { anchor: '__container__', align: VerticalAlign.Center },
          middle: { anchor: '__container__', align: HorizontalAlign.Center }
        })
        .onClick(() => {
          this.copyFileDemo()
        })
      Button('保存图片到相册')
        .onClick(() => {
          example()
        })
    }
    .height('100%')
    .width('100%')
  }
}

async function example() {
  console.info('ShowAssetsCreationDialogDemo.');

  try {
    // 获取需要保存到媒体库的位于应用沙箱的图片/视频uri
    let srcFileUris: Array<string> = [
      getContext().filesDir + '/demo.jpg'// 实际场景请使用真实的uri
    ];
    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
      {
        title: 'test2', // 可选
        fileNameExtension: 'jpg',
        photoType: photoAccessHelper.PhotoType.IMAGE,
        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选
      }
    ];
    let context = getContext();
    let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
    console.info('showAssetsCreationDialog success, data is ' + desFileUris);
    try {
      let file = fs.openSync(srcFileUris[0], fs.OpenMode.READ_ONLY)
      let file2 = fs.openSync(desFileUris[0], fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
      fs.copyFileSync(file.fd, file2.fd)
      fs.closeSync(file);
      fs.closeSync(file2);
    } catch (e) {
      console.log(JSON.stringify(e))
    }
  } catch (err) {
    console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进