1/* 2 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved. 3 */ 4import dataSharePredicates from '@ohos.data.dataSharePredicates'; 5import userFileManager from '@ohos.filemanagement.userFileManager'; 6import image from '@ohos.multimedia.image'; 7 8import { Logger } from '../../common/util/HiLogger' 9import { LocalAudioFile } from './LocalAudioFile' 10 11const logger: Logger = new Logger('LocalAudioManager') 12 13/** 14 * 对接媒体库/文件系统,提供本地音频查询能力,本地音频分页查询能力 15 */ 16export class LocalAudioManager { 17 private fileAssets: Array<userFileManager.FileAsset> = [] 18 19 /** 20 * 获取FetchResult<FileAsset> 21 */ 22 getLocalAudio(offset: number, limit: number, context: Context): Promise<Array<LocalAudioFile>> { 23 logger.info('getAudioAssets'); 24 let mgr = userFileManager.getUserFileMgr(context); 25 let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates(); 26 let fetchOptions: userFileManager.FetchOptions = { 27 fetchColumns: [ 28 userFileManager.AudioKey.TITLE.toString(), 29 userFileManager.AudioKey.ARTIST.toString(), 30 userFileManager.AudioKey.AUDIOALBUM.toString() 31 ], 32 predicates: predicates.limit(limit, offset) 33 }; 34 35 return new Promise(async (resolve) => { 36 try { 37 let fetchResult: userFileManager.FetchResult<userFileManager.FileAsset> = await mgr 38 .getAudioAssets(fetchOptions); 39 if (fetchResult) { 40 logger.info('fetchFileResult success' + JSON.stringify(fetchResult)); 41 this.fileAssets = await fetchResult.getAllObject(); 42 if (this.fileAssets && this.fileAssets.length > 0) { 43 let localAudioFile = await this.transferFileAssetsToLocalAudioFiles() 44 logger.info('localAudioFile length: ' + (await localAudioFile).length) 45 resolve(localAudioFile) 46 } else { 47 logger.error('fileAssets is null') 48 resolve([]) 49 } 50 } 51 } catch (err) { 52 logger.error('getAudioAssets failed, message = ' + err); 53 resolve([]) 54 } 55 }) 56 } 57 58 /** 59 * 将FileAsset转换为LocalAudioFile 60 */ 61 transferFileAssetsToLocalAudioFiles(): Promise<Array<LocalAudioFile>> { 62 let localAudioFile: LocalAudioFile[] = [] 63 return new Promise(async (resolve) => { 64 if (this.fileAssets) { 65 logger.info('fileAsset.length :' + this.fileAssets.length); 66 for (let fileAsset of this.fileAssets) { 67 let uri = fileAsset.uri || '' 68 let name = fileAsset.get(userFileManager.AudioKey.TITLE.toString()).toString() || fileAsset.displayName 69 let artist = fileAsset.get(userFileManager.AudioKey.ARTIST.toString()).toString() || '' 70 let album = fileAsset.get(userFileManager.AudioKey.AUDIOALBUM.toString()).toString() || '' 71 let displayName = fileAsset.displayName 72 let getThumbnail: image.PixelMap | Resource 73 try { 74 getThumbnail = await fileAsset.getThumbnail() 75 } catch (err) { 76 getThumbnail = $r('app.media.default') 77 logger.error('transferGetThumbnail failed: ' + err) 78 } 79 if (uri) { 80 let localAudioFileItem: LocalAudioFile = new LocalAudioFile(uri, name, artist, album, 81 displayName, getThumbnail) 82 localAudioFile.push(localAudioFileItem) 83 logger.info(`localAudioFileItem: uri: ${uri}, name: ${name}, artist: ${artist}, album: ${album}, getThumbnail: ${JSON.stringify(getThumbnail)}}`) 84 } else { 85 logger.error('transferFileAssetsToLocalAudioFiles failed!') 86 } 87 } 88 } 89 resolve(localAudioFile) 90 }) 91 } 92}