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