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