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