• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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