1/* 2 * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import mediaLibrary from '@ohos.multimedia.mediaLibrary'; 17import DateTimeUtil from '../utlis/DateTimeUtil'; 18import Logger from '../utlis/Logger'; 19 20const TAG = '[MediaModel]'; 21 22type FileInfo = { 23 prefix: string; 24 suffix: string; 25 directory: number; 26}; 27 28export default class MediaModel { 29 private mediaLibraryTest: mediaLibrary.MediaLibrary = undefined; 30 private static mediaInstance: MediaModel = undefined; 31 32 constructor() { 33 this.mediaLibraryTest = mediaLibrary.getMediaLibrary(globalThis.cameraContext); 34 } 35 36 public static getMediaInstance(): MediaModel { 37 if (this.mediaInstance === undefined) { 38 this.mediaInstance = new MediaModel(); 39 } 40 return this.mediaInstance; 41 } 42 43 async createAndGetUri(mediaType: mediaLibrary.MediaType): Promise<mediaLibrary.FileAsset> { 44 let dateTimeUtil: DateTimeUtil = new DateTimeUtil(); 45 let info: FileInfo = this.getInfoFromMediaType(mediaType); 46 let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`; 47 let displayName: string = `${info.prefix}${name}${info.suffix}`; 48 Logger.info(TAG, `displayName = ${displayName},mediaType = ${mediaType}`); 49 let publicPath: string = await this.mediaLibraryTest.getPublicDirectory( 50 info.directory 51 ); 52 Logger.info(TAG, `publicPath = ${publicPath}`); 53 let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset( 54 mediaType, 55 displayName, 56 publicPath 57 ); 58 return fileAsset; 59 } 60 61 async getFile(dataUri: mediaLibrary.FileAsset): Promise<mediaLibrary.FileAsset> { 62 let fileKeyObj = mediaLibrary.FileKey; 63 if (dataUri !== undefined) { 64 let args = dataUri.id.toString(); 65 let fetchOp = { 66 selections: `${fileKeyObj.ID}=?`, 67 selectionArgs: [args], 68 }; 69 const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( 70 fetchOp 71 ); 72 Logger.info( 73 TAG, 74 `fetchFileResult.getCount() = ${fetchFileResult.getCount()}` 75 ); 76 const fileAssets = await fetchFileResult.getAllObject(); 77 let fileAsset: mediaLibrary.FileAsset = fileAssets[0]; 78 return fileAsset; 79 } 80 return null; 81 } 82 83 async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise<number> { 84 let fd: number = await fileAsset.open('Rw'); 85 Logger.info(TAG, `fd = ${fd}`); 86 return fd; 87 } 88 89 async getFileAssetsFromMediaType(mediaType: number): Promise<Array<mediaLibrary.FileAsset>> { 90 Logger.info(TAG, `getFileAssetsFromType,mediaType = ${mediaType}`); 91 let fileKeyObj = mediaLibrary.FileKey; 92 let fileAssets: Array<mediaLibrary.FileAsset> = []; 93 94 try { 95 let fetchOp = { 96 selections: `${fileKeyObj.MEDIA_TYPE}=?`, 97 selectionArgs: [`${mediaType}`], 98 }; 99 const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets( 100 fetchOp 101 ); 102 Logger.info(TAG, `getFileAssetsFromType,fetchFileResult.count = ${fetchFileResult.getCount()}`); 103 if (fetchFileResult.getCount() > 0) { 104 fileAssets = await fetchFileResult.getAllObject(); 105 } 106 } catch (err) { 107 console.info(`LSQ: err ${JSON.stringify(err)}`); 108 } 109 return fileAssets; 110 } 111 112 onDateChange(callback: () => void): void { 113 this.mediaLibraryTest.on('albumChange', () => { 114 Logger.info(TAG, 'albumChange called'); 115 callback(); 116 }); 117 this.mediaLibraryTest.on('imageChange', () => { 118 Logger.info(TAG, 'imageChange called'); 119 callback(); 120 }); 121 this.mediaLibraryTest.on('audioChange', () => { 122 Logger.info(TAG, 'audioChange called'); 123 callback(); 124 }); 125 this.mediaLibraryTest.on('videoChange', () => { 126 Logger.info(TAG, 'videoChange called'); 127 callback(); 128 }); 129 this.mediaLibraryTest.on('fileChange', () => { 130 Logger.info(TAG, 'fileChange called'); 131 callback(); 132 }); 133 } 134 135 offDateChange(): void { 136 this.mediaLibraryTest.off('albumChange'); 137 this.mediaLibraryTest.off('imageChange'); 138 this.mediaLibraryTest.off('audioChange'); 139 this.mediaLibraryTest.off('videoChange'); 140 this.mediaLibraryTest.off('fileChange'); 141 } 142 143 getInfoFromMediaType(mediaType: mediaLibrary.MediaType): FileInfo { 144 let fileInfo: FileInfo = { 145 prefix: '', 146 suffix: '', 147 directory: 0 148 }; 149 switch (mediaType) { 150 case mediaLibrary.MediaType.FILE: 151 fileInfo.prefix = 'FILE_'; 152 fileInfo.suffix = '.txt'; 153 fileInfo.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS; 154 break; 155 case mediaLibrary.MediaType.IMAGE: 156 fileInfo.prefix = 'IMG_'; 157 fileInfo.suffix = '.jpg'; 158 fileInfo.directory = mediaLibrary.DirectoryType.DIR_IMAGE; 159 break; 160 case mediaLibrary.MediaType.VIDEO: 161 fileInfo.prefix = 'VID_'; 162 fileInfo.suffix = '.mp4'; 163 fileInfo.directory = mediaLibrary.DirectoryType.DIR_VIDEO; 164 break; 165 case mediaLibrary.MediaType.AUDIO: 166 fileInfo.prefix = 'AUD_'; 167 fileInfo.suffix = '.wav'; 168 fileInfo.directory = mediaLibrary.DirectoryType.DIR_AUDIO; 169 break; 170 } 171 return fileInfo; 172 } 173} 174