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