1# 媒体资源变更通知相关指导 2 3photoAccessHelper提供监听媒体资源变更的接口,供开发者对指定媒体资源变更进行监听。 4 5> **说明:** 6> 7> 在进行功能开发前,请开发者查阅[开发准备](photoAccessHelper-preparation.md),了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。 8> 文档中使用到photoAccessHelper的地方默认为使用开发准备中获取的对象,如未添加此段代码报photoAccessHelper未定义的错误请自行添加。 9 10媒体资源变更通知相关接口的异步调用仅支持使用callback方式。以下只列出部分接口使用方式,其他使用方式可以查阅[API参考](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md)。 11如无特别说明,文档中涉及的待获取的资源均视为已经预置且在数据库中存在相应数据。如出现按照示例代码执行出现获取资源为空的情况请确认文件是否已预置,数据库中是否存在该文件的数据。 12 13## 监听指定URI 14 15通过调用[registerChange](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#registerchange)接口监听指定uri。当被监听对象发生变更时返回监听器回调函数的值。 16 17### 对指定PhotoAsset注册监听 18 19对指定PhotoAsset注册监听,当被监听的PhotoAsset发生变更时,返回监听回调。 20 21**前提条件** 22 23- 获取相册管理模块photoAccessHelper实例。 24- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 25 26下面以对一张图片注册监听,通过将这张图片删除触发监听回调为例。 27 28**开发步骤** 29 301. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 312. 对指定PhotoAsset注册监听。 323. 将指定媒体资源删除。 33 34```ts 35import { dataSharePredicates } from '@kit.ArkData'; 36import { photoAccessHelper } from '@kit.MediaLibraryKit'; 37import { common } from '@kit.AbilityKit'; 38 39// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 40let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 41let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 42 43async function example() { 44 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 45 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 46 let fetchOptions: photoAccessHelper.FetchOptions = { 47 fetchColumns: [], 48 predicates: predicates 49 }; 50 try { 51 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 52 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 53 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 54 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 55 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 56 } 57 phAccessHelper.registerChange(photoAsset.uri, false, onCallback); 58 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 59 fetchResult.close(); 60 } catch (err) { 61 console.error('onCallback failed with err: ' + err); 62 } 63} 64``` 65 66### 对指定Album注册监听 67 68对指定Album注册监听,当被监听的Album发生变更时,返回监听回调。 69 70**前提条件** 71 72- 获取相册管理模块photoAccessHelper实例。 73- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 74 75下面以对一个用户相册注册监听,通过重命名相册触发监听回调为例。 76 77**开发步骤** 78 791. [获取用户相册](photoAccessHelper-userAlbum-guidelines.md#获取用户相册)。 802. 对指定Album注册监听。 813. 将指定用户相册重命名。 82 83 84```ts 85import { dataSharePredicates } from '@kit.ArkData'; 86import { photoAccessHelper } from '@kit.MediaLibraryKit'; 87import { common } from '@kit.AbilityKit'; 88 89// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 90let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 91let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 92 93async function example() { 94 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 95 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 96 predicates.equalTo(albumName, 'albumName'); 97 let fetchOptions: photoAccessHelper.FetchOptions = { 98 fetchColumns: [], 99 predicates: predicates 100 }; 101 102 try { 103 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 104 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 105 console.info('getAlbums successfully, albumUri: ' + album.albumUri); 106 107 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 108 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 109 } 110 phAccessHelper.registerChange(album.albumUri, false, onCallback); 111 album.albumName = 'newAlbumName' + Date.now(); 112 await album.commitModify(); 113 fetchResult.close(); 114 } catch (err) { 115 console.error('onCallback failed with err: ' + err); 116 } 117} 118``` 119 120## 模糊监听 121 122通过设置forChildUris值为true来注册模糊监听,uri为相册uri时,forChildUris为true能监听到相册中文件的变化,如果是false只能监听相册本身变化。uri为photoAsset时,forChildUris为true、false没有区别,uri为DefaultChangeUri时,forChildUris必须为true,如果为false将找不到该uri,收不到任何消息。 123 124### 对所有PhotoAsset注册监听 125 126对所有PhotoAsset注册监听,当有被监听的PhotoAsset发生变更时,返回监听回调。 127 128**前提条件** 129 130- 获取相册管理模块photoAccessHelper实例。 131- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 132 133下面以对所有PhotoAsset注册监听,通过将被监听的PhotoAsset删除触发监听回调为例。 134 135**开发步骤** 136 1371. 对所有PhotoAsset注册监听。 1382. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1393. 将指定媒体资源删除。 140 141```ts 142import { dataSharePredicates } from '@kit.ArkData'; 143import { photoAccessHelper } from '@kit.MediaLibraryKit'; 144import { common } from '@kit.AbilityKit'; 145 146// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 147let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 148let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 149 150async function example() { 151 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 152 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 153 } 154 phAccessHelper.registerChange(photoAccessHelper.DefaultChangeUri.DEFAULT_PHOTO_URI, true, onCallback); 155 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 156 let fetchOptions: photoAccessHelper.FetchOptions = { 157 fetchColumns: [], 158 predicates: predicates 159 }; 160 try { 161 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 162 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 163 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 164 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 165 fetchResult.close(); 166 } catch (err) { 167 console.error('onCallback failed with err: ' + err); 168 } 169} 170``` 171 172## 取消对指定URI的监听 173 174取消对指定uri的监听,通过调用[unRegisterChange](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#unregisterchange)接口取消对指定uri的监听。一个uri可以注册多个监听,存在多个callback监听时,可以取消指定注册的callback的监听;不指定callback时取消该uri的所有监听。 175 176**前提条件** 177 178- 获取相册管理模块photoAccessHelper实例。 179- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 180 181下面以取消对一张图片指定的监听为例,取消监听后,删除图片不再触发对应的监听回调。 182 183**开发步骤** 184 1851. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1862. 取消对指定媒体资源uri的监听。 1873. 将指定媒体资源删除。 188 189```ts 190import { dataSharePredicates } from '@kit.ArkData'; 191import { photoAccessHelper } from '@kit.MediaLibraryKit'; 192import { common } from '@kit.AbilityKit'; 193 194// 请在组件内获取context,确保this.getUiContext().getHostContext()返回结果为UIAbilityContext 195let context: Context = this.getUIContext().getHostContext() as common.UIAbilityContext; 196let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 197 198async function example() { 199 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 200 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 201 let fetchOptions: photoAccessHelper.FetchOptions = { 202 fetchColumns: [], 203 predicates: predicates 204 }; 205 try { 206 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 207 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 208 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 209 let onCallback1 = (changeData: photoAccessHelper.ChangeData) => { 210 console.info('onCallback1, changData: ' + JSON.stringify(changeData)); 211 } 212 let onCallback2 = (changeData: photoAccessHelper.ChangeData) => { 213 console.info('onCallback2, changData: ' + JSON.stringify(changeData)); 214 } 215 phAccessHelper.registerChange(photoAsset.uri, false, onCallback1); 216 phAccessHelper.registerChange(photoAsset.uri, false, onCallback2); 217 phAccessHelper.unRegisterChange(photoAsset.uri, onCallback1); 218 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 219 fetchResult.close(); 220 } catch (err) { 221 console.error('onCallback failed with err: ' + err); 222 } 223} 224``` 225