/* * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import mediaLibrary from '@ohos.multimedia.mediaLibrary'; import DateTimeUtil from './DateTimeUtil'; type FileInfo = { prefix: string; suffix: string; directory: number; }; export default class MediaModel { private static mediaInstance: MediaModel = undefined; private mediaLibraryTest: mediaLibrary.MediaLibrary = undefined; constructor() { this.mediaLibraryTest = mediaLibrary.getMediaLibrary(globalThis.cameraContext); } public static getMediaInstance(): MediaModel { if (this.mediaInstance === undefined) { this.mediaInstance = new MediaModel(); } return this.mediaInstance; } async createAndGetUri(mediaType: mediaLibrary.MediaType, fileName): Promise { let dateTimeUtil: DateTimeUtil = new DateTimeUtil(); let info: FileInfo = this.getInfoFromMediaType(mediaType); let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`; let displayName: string = fileName ? fileName : `${info.prefix}${name}${info.suffix}`; let publicPath: string = await this.mediaLibraryTest.getPublicDirectory( info.directory ); let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset( mediaType, displayName, publicPath ); return fileAsset; } async getFile(dataUri: mediaLibrary.FileAsset): Promise { let fileKeyObj = mediaLibrary.FileKey; if (dataUri !== undefined) { let args = dataUri.id.toString(); let fetchOp = { selections: `${fileKeyObj.ID}=?`, selectionArgs: [args], }; const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( fetchOp ); const fileAssets = await fetchFileResult.getAllObject(); let fileAsset: mediaLibrary.FileAsset = fileAssets[0]; return fileAsset; } return null; } async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise { let fd: number = await fileAsset.open('Rw'); return fd; } async getFileAssetsFromMediaType(mediaType: number): Promise> { let fileKeyObj = mediaLibrary.FileKey; let fileAssets: Array = []; try { let fetchOp = { selections: `${fileKeyObj.MEDIA_TYPE}=?`, selectionArgs: [`${mediaType}`], }; const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( fetchOp ); if (fetchFileResult.getCount() > 0) { fileAssets = await fetchFileResult.getAllObject(); } } catch (err) { console.info(`LSQ: err ${JSON.stringify(err)}`); } return fileAssets; } onDateChange(callback: () => void): void { this.mediaLibraryTest.on('albumChange', () => { callback(); }); this.mediaLibraryTest.on('imageChange', () => { callback(); }); this.mediaLibraryTest.on('audioChange', () => { callback(); }); this.mediaLibraryTest.on('videoChange', () => { callback(); }); this.mediaLibraryTest.on('fileChange', () => { callback(); }); } offDateChange(): void { this.mediaLibraryTest.off('albumChange'); this.mediaLibraryTest.off('imageChange'); this.mediaLibraryTest.off('audioChange'); this.mediaLibraryTest.off('videoChange'); this.mediaLibraryTest.off('fileChange'); } getInfoFromMediaType(mediaType: mediaLibrary.MediaType): FileInfo { let fileInfo: FileInfo = { prefix: '', suffix: '', directory: 0 }; switch (mediaType) { case mediaLibrary.MediaType.FILE: fileInfo.prefix = 'FILE_'; fileInfo.suffix = '.txt'; fileInfo.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS; break; case mediaLibrary.MediaType.IMAGE: fileInfo.prefix = 'IMG_'; fileInfo.suffix = '.jpg'; fileInfo.directory = mediaLibrary.DirectoryType.DIR_IMAGE; break; case mediaLibrary.MediaType.VIDEO: fileInfo.prefix = 'VID_'; fileInfo.suffix = '.mp4'; fileInfo.directory = mediaLibrary.DirectoryType.DIR_VIDEO; break; case mediaLibrary.MediaType.AUDIO: fileInfo.prefix = 'AUD_'; fileInfo.suffix = '.wav'; fileInfo.directory = mediaLibrary.DirectoryType.DIR_AUDIO; break; } return fileInfo; } }