1# 媒体资源使用指导 2 3应用可以通过photoAccessHelper的接口,对媒体资源(图片、视频)进行相关操作。 4 5> **说明:** 6> 7> - 在进行功能开发前,请开发者查阅[开发准备](photoAccessHelper-preparation.md),了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。 8> - 文档中使用到photoAccessHelper的地方默认为使用开发准备中获取的对象,如未添加此段代码报photoAccessHelper未定义的错误请自行添加。 9 10为了保证应用的运行效率,大部分photoAccessHelper的接口调用都是异步的。以下异步调用的API示例均采用Promise函数,更多方式可以查阅[API参考](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md)。 11 12## 获取指定媒体资源 13 14开发者可以根据特定的条件查询媒体资源,如指定类型、指定日期、指定相册等。 15 16应用通过调用[PhotoAccessHelper.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-1)获取媒体资源,并传入[FetchOptions](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#fetchoptions)对象指定检索条件。如无特别说明,文档中涉及的待获取的资源均视为已经预置且在数据库中存在相应数据。如出现按照示例代码执行出现获取资源为空的情况请确认文件是否已预置,数据库中是否存在该文件的数据。 17 18如果只想获取某个位置的对象(如第一个、最后一个、指定索引等),可以通过[FetchResult](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#fetchresult)中的接口获取对应位置的媒体资源对象。 19 20**前提条件** 21 22- 获取相册管理模块photoAccessHelper实例。 23- [申请相册管理模块读权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'。 24- 导入[dataSharePredicates](../../reference/apis-arkdata/js-apis-data-dataSharePredicates.md)模块。 25 26### 指定媒体文件名获取图片或视频资源 27 28下面以查询文件名为'test.jpg'的图片资源为例。 29 30```ts 31import { dataSharePredicates } from '@kit.ArkData'; 32import { photoAccessHelper } from '@kit.MediaLibraryKit'; 33const context = getContext(this); 34let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 35 36async function example() { 37 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 38 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 39 let fetchOptions: photoAccessHelper.FetchOptions = { 40 fetchColumns: [], 41 predicates: predicates 42 }; 43 try { 44 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 45 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 46 console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName); 47 fetchResult.close(); 48 } catch (err) { 49 console.error('getAssets failed with err: ' + err); 50 } 51} 52``` 53 54## 获取图片和视频缩略图 55 56通过接口[PhotoAsset.getThumbnail](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getthumbnail-2),传入缩略图尺寸,可以获取图片和视频缩略图。缩略图常用于UI界面展示。 57 58**前提条件** 59 60- 获取相册管理模块photoAccessHelper实例。 61- [申请相册管理模块读权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'。 62- 导入[dataSharePredicates](../../reference/apis-arkdata/js-apis-data-dataSharePredicates.md)模块。 63 64### 获取某张图片的缩略图 65 66当需要在相册展示图片和视频、编辑预览,应用需要获取某张图片的缩略图。 67 68参考以下示例,获取图片的文件描述符fd后,需要解码为统一的PixelMap,方便在应用中进行图片显示或图片处理,具体请参考[图片解码](../image/image-decoding.md)。 69 70下面以获取一张图片的缩略图为例,缩略图尺寸为720*720。 71 72**开发步骤** 73 741. 建立检索条件,用于获取图片资源。 752. 调用[PhotoAccessHelper.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-1)接口获取图片资源。 763. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一张图片。 774. 调用PhotoAsset.getThumbnail获取图片的缩略图的[PixelMap](../../reference/apis-image-kit/js-apis-image.md#pixelmap7)。 78 79```ts 80import { dataSharePredicates } from '@kit.ArkData'; 81import { image } from '@kit.ImageKit'; 82import { photoAccessHelper } from '@kit.MediaLibraryKit'; 83const context = getContext(this); 84let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 85 86async function example() { 87 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 88 let fetchOptions: photoAccessHelper.FetchOptions = { 89 fetchColumns: [], 90 predicates: predicates 91 }; 92 93 try { 94 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 95 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 96 console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName); 97 let size: image.Size = { width: 720, height: 720 }; 98 let pixelMap: image.PixelMap = await photoAsset.getThumbnail(size); 99 let imageInfo: image.ImageInfo = await pixelMap.getImageInfo() 100 console.info('getThumbnail successful, pixelMap ImageInfo size: ' + JSON.stringify(imageInfo.size)); 101 fetchResult.close(); 102 } catch (err) { 103 console.error('getThumbnail failed with err: ' + err); 104 } 105} 106``` 107 108<!--Del--> 109## 创建媒体资源 110 111创建[MediaAssetChangeRequest](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#mediaassetchangerequest11)媒体资产变更对象并写入媒体资源内容,然后调用[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口提交创建资产的变更请求。 112 113**前提条件** 114 115- 获取相册管理模块photoAccessHelper实例。 116- [申请相册管理模块读权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.WRITE_IMAGEVIDEO'。 117 118### 创建图片或视频资源(仅向系统应用开放) 119 120下面以创建一张图片资源为例。 121 122**开发步骤** 123 1241. 定义文件名和创建选项,用于创建图片资源时设置属性。 1252. 调用MediaAssetChangeRequest.createAssetRequest接口创建资产变更请求。 1263. 调用MediaAssetChangeRequest.getWriteCacheHandler接口获取临时文件写句柄,并写入图片资源的内容。 1274. 调用PhotoAccessHelper.applyChanges接口提交资产变更请求。 128 129```ts 130import { photoAccessHelper } from '@kit.MediaLibraryKit'; 131import { fileIo } from '@kit.CoreFileKit'; 132let context = getContext(this); 133let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 134 135async function example() { 136 try { 137 let displayName: string = 'testPhoto' + Date.now() + '.jpg'; 138 let createOption: photoAccessHelper.PhotoCreateOptions = { 139 subtype: photoAccessHelper.PhotoSubtype.DEFAULT 140 }; 141 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = photoAccessHelper.MediaAssetChangeRequest.createAssetRequest(context, displayName, createOption); 142 let fd: number = await assetChangeRequest.getWriteCacheHandler(); 143 // write date into fd 144 await fileIo.close(fd); 145 await phAccessHelper.applyChanges(assetChangeRequest); 146 } catch (err) { 147 console.error(`create asset failed with error: ${err.code}, ${err.message}`); 148 } 149} 150``` 151 152应用还可以调用MediaAssetChangeRequest.addResource接口指定媒体资源内容的数据来源,具体包括[应用沙箱](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#addresource11),[ArrayBuffer](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#addresource11-1)和[PhotoProxy](../../reference/apis-media-library-kit/js-apis-photoAccessHelper-sys.md#addresource11)。 153<!--DelEnd--> 154 155## 重命名媒体资源 156 157重命名修改的是文件的PhotoAsset.displayName属性,即文件的显示文件名,包含文件后缀。 158 159调用[MediaAssetChangeRequest.setTitle](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#settitle11)重命名后再通过[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)更新到数据库中完成修改。 160 161在重命名文件之前,需要先获取文件对象,可以通过[FetchResult](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#fetchresult)中的接口获取对应位置的文件。 162 163**前提条件** 164 165- 获取相册管理模块photoAccessHelper实例。 166- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.WRITE_IMAGEVIDEO'和'ohos.permission.READ_IMAGEVIDEO'。 167 168下面以将获取的图片资源中第一个文件重命名为例。 169 170**开发步骤** 171 1721. 建立检索条件,用于获取图片资源。 1732. 调用[PhotoAccessHelper.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-1)接口获取目标图片资源。 1743. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一张图片,即要重命名的图片对象。 1754. 调用[MediaAssetChangeRequest.setTitle](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#settitle11)接口将图片重命名为新的名字。 1765. 调用[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口将修改的图片属性更新到数据库中完成修改。 177 178```ts 179import { dataSharePredicates } from '@kit.ArkData'; 180import { photoAccessHelper } from '@kit.MediaLibraryKit'; 181let context = getContext(this); 182let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 183 184async function example() { 185 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 186 let fetchOptions: photoAccessHelper.FetchOptions = { 187 fetchColumns: ['title'], 188 predicates: predicates 189 }; 190 let newTitle: string = 'newTestPhoto'; 191 192 try { 193 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 194 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 195 let assetChangeRequest: photoAccessHelper.MediaAssetChangeRequest = new photoAccessHelper.MediaAssetChangeRequest(photoAsset); 196 assetChangeRequest.setTitle(newTitle); 197 await phAccessHelper.applyChanges(assetChangeRequest); 198 fetchResult.close(); 199 } catch (err) { 200 console.error(`rename failed with error: ${err.code}, ${err.message}`); 201 } 202} 203``` 204 205## 将文件放入回收站 206 207通过[MediaAssetChangeRequest.deleteAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#deleteassets11)可以将文件放入回收站。 208 209放入回收站的文件将会保存30天,30天后会自动彻底删除。在此期间,应用用户可以通过系统应用“文件管理”或“图库”恢复文件。 210 211**前提条件** 212 213- 获取相册管理模块photoAccessHelper实例。 214- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.WRITE_IMAGEVIDEO'和'ohos.permission.READ_IMAGEVIDEO'。 215 216下面以将文件检索结果中第一个文件放入回收站为例。 217 218**开发步骤** 219 2201. 建立检索条件,用于获取图片资源。 2212. 调用[PhotoAccessHelper.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-1)接口获取目标图片资源。 2223. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一张图片,即要放入回收站的图片对象。 2234. 调用[MediaAssetChangeRequest.deleteAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#deleteassets11)接口将文件放入回收站。 224 225```ts 226import { dataSharePredicates } from '@kit.ArkData'; 227import { photoAccessHelper } from '@kit.MediaLibraryKit'; 228let context = getContext(this); 229let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 230 231async function example() { 232 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 233 let fetchOptions: photoAccessHelper.FetchOptions = { 234 fetchColumns: [], 235 predicates: predicates 236 }; 237 238 try { 239 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 240 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 241 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 242 fetchResult.close(); 243 } catch (err) { 244 console.error(`deleteAssets failed with error: ${err.code}, ${err.message}`); 245 } 246} 247``` 248