1# 保存媒体库资源 2 3当用户需要保存图片、视频等用户文件到图库时,无需在应用中申请相册管理模块权限'ohos.permission.WRITE_IMAGEVIDEO',应用可以通过[安全控件](#使用安全控件保存媒体库资源)或[授权弹窗](#使用弹窗授权保存媒体库资源)的方式,将用户指定的媒体资源保存到图库中。 4 5## 使用安全控件保存媒体库资源 6 7安全控件的介绍可参考[安全控件的保存控件](../../reference/apis-arkui/arkui-ts/ts-security-components-savebutton.md)。 8 9下面以使用安全控件创建一张图片资源为例。 10 11**开发步骤** 12 131. 设置安全控件按钮属性。 142. 创建安全控件按钮。 153. 调用[MediaAssetChangeRequest.createImageAssetRequest](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#createimageassetrequest11)和[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口创建图片资源。 16 17```ts 18import { photoAccessHelper } from '@kit.MediaLibraryKit'; 19 20@Entry 21@Component 22struct Index { 23 saveButtonOptions: SaveButtonOptions = { 24 icon: SaveIconStyle.FULL_FILLED, 25 text: SaveDescription.SAVE_IMAGE, 26 buttonType: ButtonType.Capsule 27 } // 设置安全控件按钮属性 28 29 build() { 30 Row() { 31 Column() { 32 SaveButton(this.saveButtonOptions) // 创建安全控件按钮 33 .onClick(async (event, result: SaveButtonOnClickResult) => { 34 if (result == SaveButtonOnClickResult.SUCCESS) { 35 try { 36 let context = getContext(); 37 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 38 // 需要确保fileUri对应的资源存在 39 let fileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg'; 40 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createImageAssetRequest(context, fileUri); 41 await phAccessHelper.applyChanges(assetChangeRequest); 42 console.info('createAsset successfully, uri: ' + assetChangeRequest.getAsset().uri); 43 } catch (err) { 44 console.error(`create asset failed with error: ${err.code}, ${err.message}`); 45 } 46 } else { 47 console.error('SaveButtonOnClickResult create asset failed'); 48 } 49 }) 50 } 51 .width('100%') 52 } 53 .height('100%') 54 } 55} 56``` 57 58除了上述通过fileUri从应用沙箱指定资源内容的方式,开发者还可以通过ArrayBuffer的方式添加资源内容,详情请参考[addResource](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#addresource11-1)接口。 59 60## 使用弹窗授权保存媒体库资源 61 62下面以弹窗授权的方式保存一张图片资源为例。 63 64**开发步骤** 65 661. 指定待保存到媒体库的位于应用沙箱的[应用文件](../../file-management/app-file-access.md)图片uri。 672. 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选。 683. 调用[showAssetsCreationDialog](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#showassetscreationdialog12),基于弹窗授权的方式获取的目标[媒体文件](../../file-management/user-file-uri-intro.md#媒体文件uri)uri。 694. 将来源于应用沙箱的照片内容写入媒体库的目标uri。 70 71```ts 72import { photoAccessHelper } from '@kit.MediaLibraryKit'; 73import { fileIo } from '@kit.CoreFileKit'; 74 75let context = getContext(this); 76let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 77 78async function example() { 79 try { 80 // 指定待保存到媒体库的位于应用沙箱的图片uri 81 let srcFileUri = 'file://com.example.temptest/data/storage/el2/base/haps/entry/files/test.jpg'; 82 let srcFileUris: Array<string> = [ 83 srcFileUri 84 ]; 85 // 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选 86 let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [ 87 { 88 title: 'test', // 可选 89 fileNameExtension: 'jpg', 90 photoType: photoAccessHelper.PhotoType.IMAGE, 91 subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选 92 } 93 ]; 94 // 基于弹窗授权的方式获取媒体库的目标uri 95 let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs); 96 // 将来源于应用沙箱的照片内容写入媒体库的目标uri 97 let desFile: fileIo.File = await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY); 98 let srcFile: fileIo.File = await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY); 99 await fileIo.copyFile(srcFile.fd, desFile.fd); 100 fileIo.closeSync(srcFile); 101 fileIo.closeSync(desFile); 102 console.info('create asset by dialog successfully'); 103 } catch (err) { 104 console.error(`failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message}`); 105 } 106} 107``` 108