• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 媒体资源使用指导
2
3应用可以通过mediaLibrary的接口,进行媒体资源(音频、视频、图片文件等)相关操作。
4
5> **说明:**
6>
7> 在进行功能开发前,请开发者查阅[媒体库开发概述](medialibrary-overview.md),了解如何获取媒体库实例和如何申请媒体库功能开发相关权限。
8
9为了保证应用的运行效率,大部分MediaLibrary调用都是异步的,对于异步调用的API均提供了callback和Promise两种方式,以下示例均采用Promise函数,更多方式可以查阅[API参考](../reference/apis/js-apis-medialibrary.md)。
10
11## 获取媒体资源
12
13开发者可以根据特定的条件查询媒体资源,如指定类型、指定日期、指定相册等。
14
15应用通过调用[MediaLibrary.getFileAssets](../reference/apis/js-apis-medialibrary.md#getfileassets7-1)获取媒体资源,并传入MediaFetchOptions对象指定检索条件。MediaFetchOptions.selections为检索条件,使用FileKey中的枚举值作为检索条件的列名;MediaFetchOptions.selectionArgs对应selections中检索条件列的值;除此之外,可以使用order(结果排序方式)、uri(文件URI)、networkId(注册设备网络ID)作为检索条件。
16
17如果只想获取某个位置的对象(如第一个、最后一个、指定索引等),可以通过[FetchFileResult](../reference/apis/js-apis-medialibrary.md#fetchfileresult7)中的接口获取对应位置的媒体资源对象。本小节均采用getNextObject循环获取检索结果中的所有媒体资源。
18
19**前提条件**
20
21- 获取媒体库mediaLibrary实例。
22- 申请媒体库读权限“ohos.permission.READ_MEDIA”。
23
24### 指定媒体类型
25
26下面以查询图片类型的媒体资源为例。
27
28**开发步骤**
29
30selections: FileKey.MEDIA_TYPE,根据媒体类型检索。
31
32selectionArgs: MediaType.IMAGE,媒体类型为图片。
33
34```ts
35async function example() {
36  let fileKeyObj = mediaLibrary.FileKey;
37  let fileType = mediaLibrary.MediaType.IMAGE;
38  let option = {
39    selections: fileKeyObj.MEDIA_TYPE + '= ?',
40    selectionArgs: [fileType.toString()],
41  };
42  const context = getContext(this);
43  let media = mediaLibrary.getMediaLibrary(context);
44  const fetchFileResult = await media.getFileAssets(option);
45  fetchFileResult.getFirstObject().then(async (fileAsset) => {
46    console.log('getFirstObject.displayName : ' + fileAsset.displayName);
47    for (let i = 1; i < fetchFileResult.getCount(); i++) {
48      let fileAsset = await fetchFileResult.getNextObject();
49      console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
50    }
51  }).catch((err) => {
52    console.error('Failed to get first object: ' + err);
53  });
54}
55```
56
57### 指定日期
58
59下面以查询指定添加日期至今的所有媒体资源为例。实际开发中可以设置添加日期、修改日期、拍摄日期。
60
61selections: FileKey.DATE_ADDED,根据文件添加日期检索。
62
63selectionArgs:2022-8-5,具体添加时间的字符串。
64
65```ts
66async function example() {
67  let fileKeyObj = mediaLibrary.FileKey;
68  let option = {
69    selections: fileKeyObj.DATE_ADDED + '> ?',
70    selectionArgs: ['2022-8-5'],
71  };
72  const context = getContext(this);
73  let media = mediaLibrary.getMediaLibrary(context);
74  const fetchFileResult = await media.getFileAssets(option);
75  fetchFileResult.getFirstObject().then(async (fileAsset) => {
76    console.info('getFirstObject.displayName : ' + fileAsset.displayName);
77    for (let i = 1; i < fetchFileResult.getCount(); i++) {
78      let fileAsset = await fetchFileResult.getNextObject();
79      console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
80    }
81  }).catch((err) => {
82    console.error('Failed to get first object: ' + err);
83  });
84}
85```
86
87### 按指定顺序排列
88
89下面以查询图片并按文件添加日期降序排列为例。实际开发中可以设置升序(ASC)和降序(DESC)。
90
91order: FileKey.DATE_ADDED,根据文件添加日期排序;并设置排列顺序为DESC降序。
92
93```ts
94async function example() {
95  let fileKeyObj = mediaLibrary.FileKey;
96  let fileType = mediaLibrary.MediaType.IMAGE;
97  let option = {
98    selections: fileKeyObj.MEDIA_TYPE + '= ?',
99    selectionArgs: [fileType.toString()],
100    order: fileKeyObj.DATE_ADDED + " DESC",
101  };
102  const context = getContext(this);
103  let media = mediaLibrary.getMediaLibrary(context);
104  const fetchFileResult = await media.getFileAssets(option);
105  fetchFileResult.getFirstObject().then(async (fileAsset) => {
106    console.info('getFirstObject.displayName : ' + fileAsset.displayName);
107    for (let i = 1; i < fetchFileResult.getCount(); i++) {
108      let fileAsset = await fetchFileResult.getNextObject();
109      console.info('fileAsset.displayName ' + i + ': ' + fileAsset.displayName);
110    }
111  }).catch((err) => {
112    console.error('Failed to get first object: ' + err);
113  });
114}
115```
116
117### 指定相册
118
119下面以指定相册myAlbum为例。
120
121selections: FileKey.ALBUM_NAME,根据相册名称检索。
122
123selectionArgs:'myAlbum',具体相册名称。
124
125```ts
126async function example() {
127  let fileKeyObj = mediaLibrary.FileKey;
128  let option = {
129    selections: fileKeyObj.ALBUM_NAME + '= ?',
130    selectionArgs: ['myAlbum'],
131  };
132  const context = getContext(this);
133  let media = mediaLibrary.getMediaLibrary(context);
134  const fetchFileResult = await media.getFileAssets(option);
135  if (albumList.length > 0) {
136    fetchFileResult.getFirstObject().then((album) => {
137      console.info('getFirstObject.displayName : ' + album.albumName);
138    }).catch((err) => {
139      console.error('Failed to get first object: ' + err);
140    });
141  } else {
142    console.info('getAlbum list is: 0');
143  }
144}
145```
146
147## 获取相册中的图片或视频
148
149获取相册的媒体资源有两种方式,一是通过[MediaLibrary.getFileAssets](../reference/apis/js-apis-medialibrary.md#getfileassets7-1)指定相册以获取媒体资源,参考[获取指定相册的媒体资源](#指定相册);二是通过[Album.getFileAssets](../reference/apis/js-apis-medialibrary.md#getfileassets7-3)使用相册Album实例获取媒体资源。
150
151**前提条件**
152
153- 获取媒体库mediaLibrary实例。
154- 申请媒体库读权限“ohos.permission.READ_MEDIA”。
155
156**开发步骤**
157
158下面以获取相册名称为“新建相册1”的视频为例。
159
1601. 建立检索条件,用于获取目的相册实例。
161
162```ts
163let fileKeyObj = mediaLibrary.FileKey;
164let AlbumNoArgsFetchOp = {
165  selections: fileKeyObj.ALBUM_NAME + '= ?',
166  selectionArgs: ['新建相册1']
167}
168```
169
1702. 建立检索条件,用于获取目的相册下的视频资源。
171
172```ts
173let fileKeyObj = mediaLibrary.FileKey;
174let videoType = mediaLibrary.MediaType.VIDEO;
175let videoFetchOp  = {
176  selections: fileKeyObj.MEDIA_TYPE + '= ?',
177  selectionArgs: [videoType.toString()],
178}
179```
180
1813. 通过Album.getFileAssets获取对应的资源。
182
183以下为**完整示例**。
184
185```ts
186async function getCameraImagePromise() {
187  const context = getContext(this);
188  let media = mediaLibrary.getMediaLibrary(context);
189  let fileKeyObj = mediaLibrary.FileKey;
190  let videoType = mediaLibrary.MediaType.VIDEO;
191  let videoFetchOp = {
192    selections: fileKeyObj.MEDIA_TYPE + '= ?',
193    selectionArgs: [videoType.toString()],
194  }
195  let AlbumNoArgsFetchOp = {
196    selections: fileKeyObj.ALBUM_NAME + '= ?',
197    selectionArgs: ['新建相册1']
198  }
199
200  let albumList = await media.getAlbums(AlbumNoArgsFetchOp);
201  if (albumList.length > 0) {
202    const album = albumList[0];
203    let fetchFileResult = await album.getFileAssets(videoFetchOp);
204    let count = fetchFileResult.getCount();
205    console.info("get mediaLibrary VIDEO number", count);
206  } else {
207    console.info('getAlbum list is: 0');
208  }
209}
210```
211
212## 获取图片/视频缩略图
213
214通过接口[FileAsset.getThumbnail](../reference/apis/js-apis-medialibrary.md#getthumbnail8-2),传入缩略图尺寸,可以获取图片/视频缩略图。缩略图常用于UI界面展示。
215
216**前提条件**
217
218- 获取媒体库mediaLibrary实例。
219- 申请媒体库读权限“ohos.permission.READ_MEDIA”。
220
221### 获取某张图片的缩略图
222
223当需要在相册展示图片/视频、编辑预览,应用需要获取某张图片的缩略图。
224
225下面以获取相册第一张图片的缩略图为例,缩略图尺寸为720*720。
226
227**开发步骤**
228
2291. 建立检索条件,用于获取目的相册下的图片资源。
2302. 调用getFileAssets获取目标图片资源。
2313. 调用getFirstObject获取第一张图片。
2324. 调用getThumbnail获取相册中图片的缩略图。
233
234```ts
235async function getFirstThumbnailPromise() {
236  const context = getContext(this);
237  let media = mediaLibrary.getMediaLibrary(context);
238  let fileKeyObj = mediaLibrary.FileKey;
239  let imageType = mediaLibrary.MediaType.IMAGE;
240  let imagesFetchOp = {
241    selections: fileKeyObj.MEDIA_TYPE + '= ?',
242    selectionArgs: [imageType.toString()],
243  }
244
245  let size = { width: 720, height: 720 };
246  const fetchFileResult = await media.getFileAssets(imagesFetchOp);
247  if (fetchFileResult === undefined) {
248    console.error("get image failed with error");
249    return;
250  } else {
251    const asset = await fetchFileResult.getFirstObject();
252    asset.getThumbnail(size).then((pixelMap) => {
253      pixelMap.getImageInfo().then((info) => {
254        console.info('get Thumbnail info: ' + "width: " + info.size.width + " height: " + info.size.height);
255      }).catch((err) => {
256        console.error("getImageInfo failed with error: " + err);
257      });
258    }).catch((err) => {
259      console.error("getImageInfo failed with error: " + err);
260    });
261  }
262}
263```
264
265## 创建媒体资源
266
267通过接口[MediaLibrary.createAsset](../reference/apis/js-apis-medialibrary.md#createasset8-1)可以创建媒体资源。
268
269**前提条件**
270
271- 获取媒体库mediaLibrary实例。
272- 申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
273- [获取公共目录路径](medialibrary-filepath-guidelines.md)。
274
275下面以创建文件类型(MediaType.FILE)的文件为例。
276
277```ts
278async function example() {
279  let mediaType = mediaLibrary.MediaType.FILE;
280  let DIR_DOCUMENTS = mediaLibrary.DirectoryType.DIR_DOCUMENTS;
281  const context = getContext(this);
282  let media = mediaLibrary.getMediaLibrary(context);
283  const path = await media.getPublicDirectory(DIR_DOCUMENTS);
284  media.createAsset(mediaType, "testFile.text", path).then((asset) => {
285    console.info("createAsset successfully:"+ JSON.stringify(asset));
286  }).catch((err) => {
287    console.error("createAsset failed with error: " + err);
288  });
289}
290```
291
292## 将文件放入回收站
293
294通过[FileAsset.trash](../reference/apis/js-apis-medialibrary.md#trash8)可以将文件放入回收站。
295
296放入回收站的文件将会保存30天,在此期间,开发者可以将trash的入参isTrash设置为false将其恢复为正常文件;应用用户也可以通过系统应用“文件管理”或“图库”恢复文件。
297
298**前提条件**
299
300- 获取媒体库mediaLibrary实例。
301- 申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
302
303下面以将文件检索结果中第一个文件放入回收站为例。
304
305**开发步骤**
306
3071. 建立检索条件,用于获取目的相册下的图片资源。
3082. 调用getFileAssets获取目标图片资源。
3093. 调用getFirstObject获取第一张图片,即要放入回收站的图片对象。
3104. 调用trash将文件放入回收站。
311
312```ts
313async function example() {
314  let fileKeyObj = mediaLibrary.FileKey;
315  let fileType = mediaLibrary.MediaType.FILE;
316  let option = {
317    selections: fileKeyObj.MEDIA_TYPE + '= ?',
318    selectionArgs: [fileType.toString()],
319  };
320  const context = getContext(this);
321  let media = mediaLibrary.getMediaLibrary(context);
322  const fetchFileResult = await media.getFileAssets(option);
323  let asset = await fetchFileResult.getFirstObject();
324  if (asset === undefined) {
325    console.error('asset not exist');
326    return;
327  }
328  //回调为空
329  asset.trash(true).then(() => {
330    console.info("trash successfully");
331  }).catch((err) => {
332    console.error("trash failed with error: " + err);
333  });
334}
335```
336
337## 重命名媒体资源
338
339重命名修改的是文件的FileAsset.displayName属性,即文件的显示文件名,包含文件后缀。
340
341修改后再通过[FileAsset.commitModify](../reference/apis/js-apis-medialibrary.md#commitmodify8-1)更新到数据库中。
342
343在重命名文件之前,需要先获取文件对象,可以通过[FetchFileResult](../reference/apis/js-apis-medialibrary.md#fetchfileresult7)中的接口获取对应位置的文件。
344
345**前提条件**
346
347- 获取媒体库mediaLibrary实例。
348- 申请媒体库读写权限“ohos.permission.WRITE_MEDIA”。
349
350下面以将文件检索结果中第一个文件重命名为“newImage.jpg”为例。
351
352**开发步骤**
353
3541. 建立检索条件,用于获取目的相册下的图片资源。
3552. 调用getFileAssets获取目标图片资源。
3563. 调用getFirstObject获取第一张图片,即要重命名的图片对象。
3574. 将图片重命名为“newImage.jpg“。
3585. 调用FileAsset.commitModify将更新的图片属性修改到数据库中。
359
360```ts
361async function example() {
362  let fileKeyObj = mediaLibrary.FileKey;
363  let fileType = mediaLibrary.MediaType.IMAGE;
364  let option = {
365    selections: fileKeyObj.MEDIA_TYPE + '= ?',
366    selectionArgs: [fileType.toString()],
367  };
368  const context = getContext(this);
369  let media = mediaLibrary.getMediaLibrary(context);
370  const fetchFileResult = await media.getFileAssets(option);
371  let asset = await fetchFileResult.getFirstObject();
372  if (asset === undefined) {
373    console.error('asset not exist');
374    return;
375  }
376  asset.displayName = 'newImage.jpg';
377  //回调为空
378  asset.commitModify((err) => {
379    if (err) {
380      console.error('fileRename Failed ');
381      return;
382    }
383    console.info('fileRename successful.');
384  });
385}
386```
387