1# 媒体资源变更通知相关指导 2<!--Kit: Media Library Kit--> 3<!--Subsystem: Multimedia--> 4<!--Owner: @yixiaoff--> 5<!--Designer: @liweilu1--> 6<!--Tester: @xchaosioda--> 7<!--Adviser: @zengyawen--> 8 9photoAccessHelper提供监听指定媒体资源变更的接口。 10 11> **说明:** 12> 13> 在进行功能开发前,请查阅[开发准备](photoAccessHelper-preparation.md),了解如何获取相册管理模块实例和如何申请相册管理模块功能开发相关权限。 14> 文档中使用到photoAccessHelper的地方默认为使用[开发准备](photoAccessHelper-preparation.md)中获取的对象,如未添加此段代码报photoAccessHelper未定义的错误请自行添加。 15 16媒体资源变更通知相关接口的异步调用仅支持使用callback方式。以下只列出部分接口使用方式,其他使用方式可以查阅[API参考](../../reference/apis-media-library-kit/arkts-apis-photoAccessHelper.md)。 17如无特别说明,文档中涉及的待获取资源均视为已预置且数据库中存在相应数据。若按示例代码执行后资源为空,请确认文件是否已预置,以及数据库中是否存在该文件的数据。 18 19## 监听指定URI 20 21通过调用[registerChange](../../reference/apis-media-library-kit/arkts-apis-photoAccessHelper-PhotoAccessHelper.md#registerchange)接口监听指定uri。当被监听对象发生变更时返回监听器回调函数的值。 22 23### 对指定PhotoAsset注册监听 24 25对指定PhotoAsset注册监听,当监听的PhotoAsset发生变更时,返回回调。 26 27**前提条件** 28 29- 获取相册管理模块photoAccessHelper实例。 30- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 31 32以对一张图片注册监听为例,通过删除图片触发回调。 33 34**开发步骤** 35 361. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 372. 对指定PhotoAsset注册监听。 383. 将指定媒体资源删除。 39 40```ts 41import { dataSharePredicates } from '@kit.ArkData'; 42import { photoAccessHelper } from '@kit.MediaLibraryKit'; 43 44async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper, context: Context) { 45 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 46 predicates.equalTo(photoAccessHelper.PhotoKeys.DISPLAY_NAME, 'test.jpg'); 47 let fetchOptions: photoAccessHelper.FetchOptions = { 48 fetchColumns: [], 49 predicates: predicates 50 }; 51 try { 52 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 53 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 54 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 55 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 56 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 57 } 58 phAccessHelper.registerChange(photoAsset.uri, false, onCallback); 59 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 60 fetchResult.close(); 61 } catch (err) { 62 console.error('onCallback failed with err: ' + err); 63 } 64} 65``` 66 67### 对指定Album注册监听 68 69对指定Album注册监听,当Album发生变更时,触发监听回调。 70 71**前提条件** 72 73- 获取相册管理模块photoAccessHelper实例。 74- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 75 76以对一个用户相册注册监听为例,通过重命名相册触发回调。 77 78**开发步骤** 79 801. [获取用户相册](photoAccessHelper-userAlbum-guidelines.md#获取用户相册)。 812. 对指定Album注册监听。 823. 将指定用户相册重命名。 83 84 85```ts 86import { dataSharePredicates } from '@kit.ArkData'; 87import { photoAccessHelper } from '@kit.MediaLibraryKit'; 88 89async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper) { 90 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 91 let albumName: photoAccessHelper.AlbumKeys = photoAccessHelper.AlbumKeys.ALBUM_NAME; 92 predicates.equalTo(albumName, 'albumName'); 93 let fetchOptions: photoAccessHelper.FetchOptions = { 94 fetchColumns: [], 95 predicates: predicates 96 }; 97 98 try { 99 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.Album> = await phAccessHelper.getAlbums(photoAccessHelper.AlbumType.USER, photoAccessHelper.AlbumSubtype.USER_GENERIC, fetchOptions); 100 let album: photoAccessHelper.Album = await fetchResult.getFirstObject(); 101 console.info('getAlbums successfully, albumUri: ' + album.albumUri); 102 103 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 104 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 105 } 106 phAccessHelper.registerChange(album.albumUri, false, onCallback); 107 album.albumName = 'newAlbumName' + Date.now(); 108 await album.commitModify(); 109 fetchResult.close(); 110 } catch (err) { 111 console.error('onCallback failed with err: ' + err); 112 } 113} 114``` 115 116## 模糊监听 117 1181. 通过设置forChildUris值为true来注册模糊监听,uri为相册uri时,forChildUris为true能监听到相册中文件的变化,如果是false只能监听相册本身变化。 1192. uri为photoAsset时,forChildUris为true、false没有区别。 1203. uri为DefaultChangeUri时,forChildUris必须为true,如果为false将找不到该uri,收不到任何消息。 121 122### 对所有PhotoAsset注册监听 123 124对所有PhotoAsset注册监听,当被监听的PhotoAsset发生变更时,返回监听回调。 125 126**前提条件** 127 128- 获取相册管理模块photoAccessHelper实例。 129- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 130 131下面以对所有PhotoAsset注册监听,通过将被监听的PhotoAsset删除触发监听回调为例。 132 133**开发步骤** 134 1351. 对所有PhotoAsset注册监听。 1362. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1373. 将指定媒体资源删除。 138 139```ts 140import { dataSharePredicates } from '@kit.ArkData'; 141import { photoAccessHelper } from '@kit.MediaLibraryKit'; 142 143async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper, context: Context) { 144 let onCallback = (changeData: photoAccessHelper.ChangeData) => { 145 console.info('onCallback successfully, changData: ' + JSON.stringify(changeData)); 146 } 147 phAccessHelper.registerChange(photoAccessHelper.DefaultChangeUri.DEFAULT_PHOTO_URI, true, onCallback); 148 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 149 let fetchOptions: photoAccessHelper.FetchOptions = { 150 fetchColumns: [], 151 predicates: predicates 152 }; 153 try { 154 let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions); 155 let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject(); 156 console.info('getAssets photoAsset.uri : ' + photoAsset.uri); 157 await photoAccessHelper.MediaAssetChangeRequest.deleteAssets(context, [photoAsset]); 158 fetchResult.close(); 159 } catch (err) { 160 console.error('onCallback failed with err: ' + err); 161 } 162} 163``` 164 165## 取消对指定URI的监听 166 167取消对指定uri的监听,通过调用[unRegisterChange](../../reference/apis-media-library-kit/arkts-apis-photoAccessHelper-PhotoAccessHelper.md#unregisterchange)接口取消对指定uri的监听。一个uri可以注册多个监听,存在多个callback监听时,可以取消指定注册的callback的监听;不指定callback时取消该uri的所有监听。 168 169**前提条件** 170 171- 获取相册管理模块photoAccessHelper实例。 172- [申请相册管理模块权限](photoAccessHelper-preparation.md#申请相册管理模块功能相关权限)'ohos.permission.READ_IMAGEVIDEO'和'ohos.permission.WRITE_IMAGEVIDEO'。 173 174下面以取消对图片指定的监听为例,取消监听后,删除图片不再触发对应的监听回调。 175 176**开发步骤** 177 1781. [获取指定媒体资源](photoAccessHelper-resource-guidelines.md#获取指定媒体资源)。 1792. 取消对指定媒体资源uri的监听。 1803. 将指定媒体资源删除。 181 182```ts 183import { dataSharePredicates } from '@kit.ArkData'; 184import { photoAccessHelper } from '@kit.MediaLibraryKit'; 185 186async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper, context: Context) { 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