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'; 37const context = getContext(this); 38let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 39 40async function example() { 41 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 42 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 43 let fetchOptions: photoAccessHelper.FetchOptions = { 44 fetchColumns: [], 45 predicates: predicates 46 }; 47 try { 48 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 49 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 50 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 51 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 52 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 53 } 54 phAccessHelper.registerChange(photoAsset.uri, false, onCallback); 55 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 56 fetchResult.close(); 57 } catch (err) { 58 console.error('onCallback failed with err: ' + err); 59 } 60} 61``` 62 63### 对指定Album注册监听 64 65对指定Album注册监听,当被监听的Album发生变更时,返回监听回调。 66 67**前提条件** 68 69- 获取相册管理模块photoAccessHelper实例。 70- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 71 72下面以对一个用户相册注册监听,通过重命名相册触发监听回调为例。 73 74**开发步骤** 75 761. [获取用户相册](photoAccessHelper-userAlbum-guidelines.md#获取用户相册)。 772. 对指定Album注册监听。 783. 将指定用户相册重命名。 79 80 81```ts 82import { dataSharePredicates } from '@kit.ArkData'; 83import { photoAccessHelper } from '@kit.MediaLibraryKit'; 84const context = getContext(this); 85let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 86 87async function example() { 88 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 89 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 90 predicates.equalTo(albumName, 'albumName'); 91 let fetchOptions: photoAccessHelper.FetchOptions = { 92 fetchColumns: [], 93 predicates: predicates 94 }; 95 96 try { 97 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 98 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 99 console.info('getAlbums successfully, albumUri: ' + album.albumUri); 100 101 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 102 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 103 } 104 phAccessHelper.registerChange(album.albumUri, false, onCallback); 105 album.albumName = 'newAlbumName' + Date.now(); 106 await album.commitModify(); 107 fetchResult.close(); 108 } catch (err) { 109 console.error('onCallback failed with err: ' + err); 110 } 111} 112``` 113 114## 模糊监听 115 116通过设置forChildUris值为true来注册模糊监听,uri为相册uri时,forChildUris为true能监听到相册中文件的变化,如果是false只能监听相册本身变化。uri为photoAsset时,forChildUris为true、false没有区别,uri为DefaultChangeUri时,forChildUris必须为true,如果为false将找不到该uri,收不到任何消息。 117 118### 对所有PhotoAsset注册监听 119 120对所有PhotoAsset注册监听,当有被监听的PhotoAsset发生变更时,返回监听回调。 121 122**前提条件** 123 124- 获取相册管理模块photoAccessHelper实例。 125- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 126 127下面以对所有PhotoAsset注册监听,通过将被监听的PhotoAsset删除触发监听回调为例。 128 129**开发步骤** 130 1311. 对所有PhotoAsset注册监听。 1322. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1333. 将指定媒体资源删除。 134 135```ts 136import { dataSharePredicates } from '@kit.ArkData'; 137import { photoAccessHelper } from '@kit.MediaLibraryKit'; 138const context = getContext(this); 139let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 140 141async function example() { 142 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 143 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 144 } 145 phAccessHelper.registerChange(photoAccessHelper.DefaultChangeUri.DEFAULT_PHOTO_URI, true, onCallback); 146 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 147 let fetchOptions: photoAccessHelper.FetchOptions = { 148 fetchColumns: [], 149 predicates: predicates 150 }; 151 try { 152 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 153 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 154 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 155 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 156 fetchResult.close(); 157 } catch (err) { 158 console.error('onCallback failed with err: ' + err); 159 } 160} 161``` 162 163## 取消对指定URI的监听 164 165取消对指定uri的监听,通过调用[unRegisterChange](../../reference/apis-media-library-kit/js-apis-photoAccessHelper.md#unregisterchange)接口取消对指定uri的监听。一个uri可以注册多个监听,存在多个callback监听时,可以取消指定注册的callback的监听;不指定callback时取消该uri的所有监听。 166 167**前提条件** 168 169- 获取相册管理模块photoAccessHelper实例。 170- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 171 172下面以取消对一张图片指定的监听为例,取消监听后,删除图片不再触发对应的监听回调。 173 174**开发步骤** 175 1761. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1772. 取消对指定媒体资源uri的监听。 1783. 将指定媒体资源删除。 179 180```ts 181import { dataSharePredicates } from '@kit.ArkData'; 182import { photoAccessHelper } from '@kit.MediaLibraryKit'; 183const context = getContext(this); 184let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); 185 186async function example() { 187 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 188 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 189 let fetchOptions: photoAccessHelper.FetchOptions = { 190 fetchColumns: [], 191 predicates: predicates 192 }; 193 try { 194 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 195 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 196 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 197 let onCallback1 = (changeData: photoAccessHelper.ChangeData) => { 198 console.info('onCallback1, changData: ' + JSON.stringify(changeData)); 199 } 200 let onCallback2 = (changeData: photoAccessHelper.ChangeData) => { 201 console.info('onCallback2, changData: ' + JSON.stringify(changeData)); 202 } 203 phAccessHelper.registerChange(photoAsset.uri, false, onCallback1); 204 phAccessHelper.registerChange(photoAsset.uri, false, onCallback2); 205 phAccessHelper.unRegisterChange(photoAsset.uri, onCallback1); 206 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 207 fetchResult.close(); 208 } catch (err) { 209 console.error('onCallback failed with err: ' + err); 210 } 211} 212``` 213