1# 用户相册资源使用指导 2 3photoAccessHelper提供用户相册相关的接口,供开发者创建、删除用户相册,往用户相册中添加和删除图片和视频资源等。 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<!--Del--> 14## 创建用户相册(仅向系统应用开放) 15 16通过[MediaAlbumChangeRequest.createAlbumRequest](../../reference/apis-media-library-kit/js-apis-photoAccessHelper-sys.md#createalbumrequest11)和[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口创建用户相册。 17 18待创建的相册名参数规格为: 19 20- 相册名字符串长度为1~255。 21- 不允许出现的非法英文字符,包括:<br> . \ / : * ? " ' ` < > | { } [ ] 22- 英文字符大小写不敏感。 23- 相册名不允许重名。 24 25**前提条件** 26 27- 获取相册管理模块photoAccessHelper实例。 28- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.WRITE_IMAGEVIDEO'。 29 30下面以创建一个用户相册为例。 31 32**开发步骤** 33 341. 设置相册名。 352. 调用MediaAlbumChangeRequest.createAlbumRequest接口创建相册变更请求。 363. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。 37 38```ts 39import { photoAccessHelper } from '@kit.MediaLibraryKit'; 40import { common } from '@kit.AbilityKit'; 41 42// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 43let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 44let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 45 46async function example() { 47 try { 48 let albumName = 'albumName'; 49 let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = photoAccessHelper.MediaAlbumChangeRequest.createAlbumRequest(context, albumName); 50 await phAccessHelper.applyChanges(albumChangeRequest); 51 let album: photoAccessHelper.Album = albumChangeRequest.getAlbum(); 52 console.info('create album successfully, album name: ' + album.albumName + ' uri: ' + album.albumUri); 53 } catch (err) { 54 console.error('create album failed with err: ' + err); 55 } 56} 57``` 58<!--DelEnd--> 59 60## 获取用户相册 61 62通过[PhotoAccessHelper.getAlbums](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getalbums-2)接口获取用户相册。 63 64**前提条件** 65 66- 获取相册管理模块photoAccessHelper实例。 67- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'。 68 69下面以获取一个相册名为'albumName'的用户相册为例。 70 71**开发步骤** 72 731. 建立检索条件,用于获取用户相册。 742. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 753. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一个用户相册。 76 77```ts 78import { dataSharePredicates } from '@kit.ArkData'; 79import { photoAccessHelper } from '@kit.MediaLibraryKit'; 80import { common } from '@kit.AbilityKit'; 81 82// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 83let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 84let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 85 86async function example() { 87 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 88 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 89 predicates.equalTo(albumName, 'albumName'); 90 let fetchOptions: photoAccessHelper.FetchOptions = { 91 fetchColumns: [], 92 predicates: predicates 93 }; 94 95 try { 96 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 97 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 98 console.info('getAlbums successfully, albumName: ' + album.albumName); 99 fetchResult.close(); 100 } catch (err) { 101 console.error('getAlbums failed with err: ' + err); 102 } 103} 104``` 105 106## 重命名用户相册 107 108重命名用户相册修改的是相册的Album.albumName属性。 109 110调用[MediaAlbumChangeRequest.setAlbumName](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#setalbumname11)重命名用户相册后再通过[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)更新到数据库中完成修改。 111 112在重命名用户相册之前,需要先获取相册对象,可以通过[FetchResult](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#fetchresult)中的接口获取对应位置的用户相册。 113 114重命名的相册名参数规格为: 115 116- 相册名字符串长度为1~255。 117- 不允许出现的非法英文字符,包括:<br> . \ / : * ? " ' ` < > | { } [ ] 118- 英文字符大小写不敏感。 119- 相册名不允许重名。 120 121**前提条件** 122 123- 获取相册管理模块photoAccessHelper实例。 124- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 125 126下面以将一个相册名为'albumName'的用户相册重命名为例。 127 128**开发步骤** 129 1301. 建立检索条件,用于获取用户相册。 1312. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 1323. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一个用户相册。 1334. 调用MediaAlbumChangeRequest.setAlbumName接口设置新的相册名。 1345. 调用PhotoAccessHelper.applyChanges接口将修改的相册属性更新到数据中完成修改。 135 136```ts 137import { dataSharePredicates } from '@kit.ArkData'; 138import { photoAccessHelper } from '@kit.MediaLibraryKit'; 139import { common } from '@kit.AbilityKit'; 140 141// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 142let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 143let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 144 145async function example() { 146 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 147 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 148 predicates.equalTo(albumName, 'albumName'); 149 let fetchOptions: photoAccessHelper.FetchOptions = { 150 fetchColumns: [], 151 predicates: predicates 152 }; 153 154 try { 155 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 156 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 157 console.info('getAlbums successfully, albumName: ' + album.albumName); 158 let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album); 159 let newAlbumName: string = 'newAlbumName'; 160 albumChangeRequest.setAlbumName(newAlbumName); 161 await phAccessHelper.applyChanges(albumChangeRequest); 162 console.info('setAlbumName successfully, new albumName: ' + album.albumName); 163 fetchResult.close(); 164 } catch (err) { 165 console.error('setAlbumName failed with err: ' + err); 166 } 167} 168``` 169 170## 添加图片和视频到用户相册中 171 172先[获取用户相册](#获取用户相册)对象和需要添加到相册中的图片或视频的对象数组,然后调用[MediaAlbumChangeRequest.addAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#addassets11)和[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口往用户相册中添加图片或视频。 173 174**前提条件** 175 176- 获取相册管理模块photoAccessHelper实例。 177- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 178 179下面以将往相册名为'albumName'的用户相册中添加一张图片为例。 180 181**开发步骤** 182 1831. 建立相册检索条件,用于获取用户相册。 1842. 建立图片检索条件,用于获取图片。 1853. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 1864. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject)接口获取第一个用户相册。 1875. 调用[PhotoAccessHelper.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets)接口获取图片资源。 1886. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject)接口获取第一张图片。 1897. 调用MediaAlbumChangeRequest.addAssets接口往用户相册中添加图片。 1908. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。 191 192```ts 193import { dataSharePredicates } from '@kit.ArkData'; 194import { photoAccessHelper } from '@kit.MediaLibraryKit'; 195import { common } from '@kit.AbilityKit'; 196 197// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 198let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 199let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 200 201async function example() { 202 let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 203 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 204 albumPredicates.equalTo(albumName, 'albumName'); 205 let albumFetchOptions: photoAccessHelper.FetchOptions = { 206 fetchColumns: [], 207 predicates: albumPredicates 208 }; 209 210 let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 211 let photoFetchOptions: photoAccessHelper.FetchOptions = { 212 fetchColumns: [], 213 predicates: photoPredicates 214 }; 215 216 try { 217 let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions); 218 let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject(); 219 console.info('getAlbums successfully, albumName: ' + album.albumName); 220 let photoFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(photoFetchOptions); 221 let photoAsset: photoAccessHelper.PhotoAsset = await photoFetchResult.getFirstObject(); 222 console.info('getAssets successfully, albumName: ' + photoAsset.displayName); 223 let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album); 224 albumChangeRequest.addAssets([photoAsset]); 225 await phAccessHelper.applyChanges(albumChangeRequest); 226 console.info('succeed to add ' + photoAsset.displayName + ' to ' + album.albumName); 227 albumFetchResult.close(); 228 photoFetchResult.close(); 229 } catch (err) { 230 console.error('addAssets failed with err: ' + err); 231 } 232} 233``` 234 235## 获取用户相册中的图片和视频 236 237先[获取用户相册](#获取用户相册)对象,然后调用[Album.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-3)接口获取用户相册中的图片资源。 238 239**前提条件** 240 241- 获取相册管理模块photoAccessHelper实例。 242- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 243 244下面以获取相册名为'albumName'的用户相册中的一张图片为例。 245 246**开发步骤** 247 2481. 建立相册检索条件,用于获取用户相册。 2492. 建立图片检索条件,用于获取图片。 2503. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 2514. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一个用户相册。 2525. 调用Album.getAssets接口获取用户相册中的图片资源。 2536. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一张图片。 254 255```ts 256import { dataSharePredicates } from '@kit.ArkData'; 257import { photoAccessHelper } from '@kit.MediaLibraryKit'; 258import { common } from '@kit.AbilityKit'; 259 260// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 261let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 262let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 263 264async function example() { 265 let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 266 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 267 albumPredicates.equalTo(albumName, 'albumName'); 268 let albumFetchOptions: photoAccessHelper.FetchOptions = { 269 fetchColumns: [], 270 predicates: albumPredicates 271 }; 272 273 let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 274 let photoFetchOptions: photoAccessHelper.FetchOptions = { 275 fetchColumns: [], 276 predicates: photoPredicates 277 }; 278 279 try { 280 let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions); 281 let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject(); 282 console.info('getAlbums successfully, albumName: ' + album.albumName); 283 let photoFetchResult = await album.getAssets(photoFetchOptions); 284 let photoAsset = await photoFetchResult.getFirstObject(); 285 console.info('album getAssets successfully, albumName: ' + photoAsset.displayName); 286 albumFetchResult.close(); 287 photoFetchResult.close(); 288 } catch (err) { 289 console.error('album getAssets failed with err: ' + err); 290 } 291} 292``` 293 294## 从用户相册中移除图片和视频 295 296先[获取用户相册](#获取用户相册)对象,然后调用[Album.getAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getassets-3)接口获取用户相册中的资源。 297 298选择其中要移除的资源,然后调用[MediaAlbumChangeRequest.removeAssets](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#removeassets11)和[PhotoAccessHelper.applyChanges](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#applychanges11)接口移除。 299 300**前提条件** 301 302- 获取相册管理模块photoAccessHelper实例。 303- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 304 305下面以将往相册名为'albumName'的用户相册中移除一张图片为例。 306 307**开发步骤** 308 3091. 建立相册检索条件,用于获取用户相册。 3102. 建立图片检索条件,用于获取图片。 3113. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 3124. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一个用户相册。 3135. 调用Album.getAssets接口获取图片资源。 3146. 调用[FetchResult.getFirstObject](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#getfirstobject-1)接口获取第一张图片。 3157. 调用MediaAlbumChangeRequest.removeAssets接口从用户相册中移除图片。 3168. 调用PhotoAccessHelper.applyChanges接口提交相册变更请求。 317 318```ts 319import { dataSharePredicates } from '@kit.ArkData'; 320import { photoAccessHelper } from '@kit.MediaLibraryKit'; 321import { common } from '@kit.AbilityKit'; 322 323// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 324let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 325let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 326 327async function example() { 328 let albumPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 329 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 330 albumPredicates.equalTo(albumName, 'albumName'); 331 let albumFetchOptions: photoAccessHelper.FetchOptions = { 332 fetchColumns: [], 333 predicates: albumPredicates 334 }; 335 336 let photoPredicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 337 let photoFetchOptions: photoAccessHelper.FetchOptions = { 338 fetchColumns: [], 339 predicates: photoPredicates 340 }; 341 342 try { 343 let albumFetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, albumFetchOptions); 344 let album: photoAccessHelper.Album = await albumFetchResult.getFirstObject(); 345 console.info('getAlbums successfully, albumName: ' + album.albumName); 346 let photoFetchResult = await album.getAssets(photoFetchOptions); 347 let photoAsset = await photoFetchResult.getFirstObject(); 348 console.info('album getAssets successfully, albumName: ' + photoAsset.displayName); 349 let albumChangeRequest: photoAccessHelper.MediaAlbumChangeRequest = new photoAccessHelper.MediaAlbumChangeRequest(album); 350 albumChangeRequest.removeAssets([photoAsset]); 351 await phAccessHelper.applyChanges(albumChangeRequest); 352 console.info('succeed to remove ' + photoAsset.displayName + ' from ' + album.albumName); 353 albumFetchResult.close(); 354 photoFetchResult.close(); 355 } catch (err) { 356 console.error('removeAssets failed with err: ' + err); 357 } 358} 359``` 360 361<!--Del--> 362## 删除用户相册(仅向系统应用开放) 363 364先[获取用户相册](#获取用户相册)对象,然后调用[MediaAlbumChangeRequest.deleteAlbums](../../reference/apis-media-library-kit/js-apis-photoAccessHelper-sys.md#deletealbums11)删除用户相册。 365 366**前提条件** 367 368- 获取相册管理模块photoAccessHelper实例。 369- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 370 371下面以删除一个相册名为'albumName'的用户相册为例。 372 373**开发步骤** 374 3751. 建立检索条件,用于获取用户相册。 3762. 调用PhotoAccessHelper.getAlbums接口获取用户相册资源。 3773. 调用FetchResult.getFirstObject接口获取第一个用户相册。 3784. 调用MediaAlbumChangeRequest.deleteAlbums接口删除第一个用户相册。 379 380```ts 381import { dataSharePredicates } from '@kit.ArkData'; 382import { photoAccessHelper } from '@kit.MediaLibraryKit'; 383import { common } from '@kit.AbilityKit'; 384 385// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 386let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 387let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 388 389async function example() { 390 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 391 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 392 predicates.equalTo(albumName, 'albumName'); 393 let fetchOptions: photoAccessHelper.FetchOptions = { 394 fetchColumns: [], 395 predicates: predicates 396 }; 397 398 try { 399 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 400 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 401 console.info('getAlbums successfully, albumName: ' + album.albumName); 402 await photoAccessHelper.MediaAlbumChangeRequest.deleteAlbums(context, [album]); 403 fetchResult.close(); 404 } catch (err) { 405 console.error('deleteAlbums failed with err: ' + err); 406 } 407} 408``` 409<!--DelEnd--> 410