• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 保存媒体库资源
2
3当用户需要保存图片、视频等用户文件到图库时,无需在应用中申请相册管理模块权限'ohos.permission.WRITE_IMAGEVIDEO',应用可以通过[安全控件](#使用安全控件保存媒体库资源)或[授权弹窗](#使用弹窗授权保存媒体库资源)的方式,将用户指定的媒体资源保存到图库中。
4
5## 获取支持保存的资源格式
6
7下面以获取支持保存的图片类型资源格式为例。
8
9**开发步骤**
10
11调用[phAccessHelper.getSupportedPhotoFormats](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getsupportedphotoformats18)接口获取支持保存的图片类型资源格式。
12
13```ts
14import photoAccessHelper from '@ohos.file.photoAccessHelper';
15import { common } from '@kit.AbilityKit';
16
17// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext
18let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
19let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
20@Entry
21@Component
22
23struct Index {
24  @State outputText: string = '支持的类型为:\n';
25
26  async function example(){
27    try {
28      this.outputText = '支持的类型为:\n';
29      //参数为1表示获取支持的图片类型格式,参数为2表示获取支持的视频类型格式。
30      let imageFormat  = await phAccessHelper.getSupportedPhotoFormats(1);
31      let result = "";
32      for (let i = 0; i < imageFormat.length; i++) {
33        result += imageFormat[i];
34        if (i !== imageFormat.length - 1) {
35          result += ', ';
36        }
37      }
38      this.outputText += result;
39      console.info('getSupportedPhotoFormats success, data is ' + outputText);
40    } catch (error) {
41      console.error('getSupportedPhotoFormats failed, errCode is', error);
42    }
43  }
44```
45
46## 使用安全控件保存媒体库资源
47
48安全控件的介绍可参考[安全控件的保存控件](../../reference/apis-arkui/arkui-ts/ts-security-components-savebutton.md)。
49
50下面以使用安全控件创建一张图片资源为例。
51
52**开发步骤**
53
541. 设置安全控件按钮属性。
552. 创建安全控件按钮。
563. 调用[MediaAssetChangeRequest.createImageAssetRequest](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#createimageassetrequest11)和[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口创建图片资源。
57
58```ts
59import { photoAccessHelper } from '@kit.MediaLibraryKit';
60import { common } from '@kit.AbilityKit';
61
62@Entry
63@Component
64struct Index {
65    saveButtonOptions: SaveButtonOptions = {
66    icon: SaveIconStyle.FULL_FILLED,
67    text: SaveDescription.SAVE_IMAGE,
68    buttonType: ButtonType.Capsule
69  } // 设置安全控件按钮属性。
70
71  build() {
72    Row() {
73      Column() {
74        SaveButton(this.saveButtonOptions) // 创建安全控件按钮。
75          .onClick(async (event, result: SaveButtonOnClickResult) => {
76             if (result == SaveButtonOnClickResult.SUCCESS) {
77               try {
78                 let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
79                 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
80                 // 需要确保fileUri对应的资源存在。
81                 let fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';
82                 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri);
83                 await phAccessHelper.applyChanges(assetChangeRequest);
84                 console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri);
85               } catch (err) {
86                 console.error(`create asset failed with error: ${err.code}, ${err.message}`);
87               }
88             } else {
89               console.error('SaveButtonOnClickResult create asset failed');
90             }
91          })
92      }
93      .width('100%')
94    }
95    .height('100%')
96  }
97}
98```
99
100除了上述通过fileUri从应用沙箱指定资源内容的方式,开发者还可以通过ArrayBuffer的方式添加资源内容,详情请参考[addResource](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#addresource11-1)接口。
101
102## 使用弹窗授权保存媒体库资源
103
104下面以弹窗授权的方式保存一张图片资源为例。
105
106**开发步骤**
107
1081. 指定待保存到媒体库的位于应用沙箱的[应用文件](../../file-management/app-file-access.md)图片uri。
1092. 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选。
1103. 调用[showAssetsCreationDialog](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#showassetscreationdialog12),基于弹窗授权的方式获取的目标[媒体文件](../../file-management/user-file-uri-intro.md#媒体文件uri)uri。
1114. 将来源于应用沙箱的照片内容写入媒体库的目标uri。
112
113```ts
114import { photoAccessHelper } from '@kit.MediaLibraryKit';
115import { fileIo } from '@kit.CoreFileKit';
116import { common } from '@kit.AbilityKit';
117
118// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext
119let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext;
120let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
121
122async function example() {
123  try {
124    // 指定待保存到媒体库的位于应用沙箱的图片uri。
125    let srcFileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg';
126    let srcFileUris: Array<string> = [
127      srcFileUri
128    ];
129    // 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选。
130    let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
131      {
132        title: 'test', // 可选。
133        fileNameExtension: 'jpg',
134        photoType: photoAccessHelper.PhotoType.IMAGE,
135        subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选。
136      }
137    ];
138    // 基于弹窗授权的方式获取媒体库的目标uri。
139    let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
140    // 将来源于应用沙箱的照片内容写入媒体库的目标uri。
141    let desFile: fileIo.File = await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY);
142    let srcFile: fileIo.File = await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY);
143    await fileIo.copyFile(srcFile.fd, desFile.fd);
144    fileIo.closeSync(srcFile);
145    fileIo.closeSync(desFile);
146    console.info('create asset by dialog successfully');
147  } catch (err) {
148    console.error(`failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message}`);
149  }
150}
151```
152