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