1/* 2 * Copyright (c) 2022 Huawei Device 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 '../model/DateTimeUtil' 18import Logger from './Logger' 19 20export default class MediaUtils { 21 private tag: string = 'qlw MediaUtils' 22 private mediaTest: mediaLibrary.MediaLibrary = mediaLibrary.getMediaLibrary(globalThis.abilityContext) 23 private static instance: MediaUtils = new MediaUtils() 24 25 public static getInstance() { 26 if (this.instance === undefined) { 27 this.instance = new MediaUtils() 28 } 29 return this.instance 30 } 31 32 async createAndGetUri(mediaType: number) { 33 let info = this.getInfoFromType(mediaType) 34 let dateTimeUtil = new DateTimeUtil() 35 let name = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}` 36 let displayName = `${info.prefix}${name}${info.suffix}` 37 Logger.info(this.tag, `displayName = ${displayName},mediaType = ${mediaType}`) 38 let publicPath = await this.mediaTest.getPublicDirectory(info.directory) 39 Logger.info(this.tag, `publicPath = ${publicPath}`) 40 try { 41 return await this.mediaTest.createAsset(mediaType, displayName, publicPath) 42 } catch (err) { 43 Logger.info(this.tag, `createAsset err ` + JSON.stringify(err)) 44 } 45 46 } 47 48 async queryFile(dataUri: any) { 49 let fileKeyObj = mediaLibrary.FileKey 50 if (dataUri !== undefined) { 51 let args = dataUri.id.toString() 52 let fetchOp = { 53 selections: `${fileKeyObj.ID}=?`, 54 selectionArgs: [args], 55 } 56 const fetchFileResult = await this.mediaTest.getFileAssets(fetchOp) 57 Logger.info(this.tag, `fetchFileResult.getCount() = ${fetchFileResult.getCount()}`) 58 const fileAsset = await fetchFileResult.getAllObject() 59 return fileAsset[0] 60 } 61 } 62 63 async getFdPath(fileAsset: any) { 64 let fd = await fileAsset.open('Rw') 65 Logger.info(this.tag, `fd = ${fd}`) 66 return fd 67 } 68 69 async createFile(mediaType: number) { 70 let dataUri = await this.createAndGetUri(mediaType) 71 if (dataUri) { 72 let fileAsset = await this.queryFile(dataUri) 73 if (fileAsset) { 74 let fd = await this.getFdPath(fileAsset) 75 return fd 76 } 77 } 78 } 79 80 async getFileAssetsAlbum(path){ 81 let fileKeyObj = mediaLibrary.FileKey 82 // ALBUM_NAME 83 let fetchOp = { 84 selections: `${fileKeyObj.RELATIVE_PATH}=?`, 85 selectionArgs: [`${path}`], 86 } 87 const fetchFileResult = await this.mediaTest.getFileAssets(fetchOp) 88 Logger.info(this.tag, `getFileAssetsAlbum,fetchFileResult.count = ${fetchFileResult.getCount()}`) 89 let fileAssets:Array<mediaLibrary.FileAsset> = [] 90 if (fetchFileResult.getCount() > 0) { 91 fileAssets = await fetchFileResult.getAllObject() 92 } 93 return fileAssets 94 } 95 96 async getFileAssetsFromType(mediaType: number) { 97 Logger.info(this.tag, `getFileAssetsFromType,mediaType = ${mediaType}`) 98 let fileKeyObj = mediaLibrary.FileKey 99 // ALBUM_NAME 100 let fetchOp = { 101 selections: `${fileKeyObj.MEDIA_TYPE}=?`, 102 selectionArgs: [`${mediaType}`], 103 } 104 const fetchFileResult = await this.mediaTest.getFileAssets(fetchOp) 105 Logger.info(this.tag, `getFileAssetsFromType,fetchFileResult.count = ${fetchFileResult.getCount()}`) 106 let fileAssets = [] 107 if (fetchFileResult.getCount() > 0) { 108 fileAssets = await fetchFileResult.getAllObject() 109 } 110 return fileAssets 111 } 112 113 async getAlbums() { 114 Logger.info(this.tag, 'getAlbums begin') 115 let albums = [] 116 const [ files, images, videos, audios ] = await Promise.all([ 117 this.getFileAssetsFromType(mediaLibrary.MediaType.FILE), 118 this.getFileAssetsFromType(mediaLibrary.MediaType.IMAGE), 119 this.getFileAssetsFromType(mediaLibrary.MediaType.VIDEO), 120 this.getFileAssetsFromType(mediaLibrary.MediaType.AUDIO) 121 ]) 122 albums.push({ 123 albumName: 'Documents', count: files.length, mediaType: mediaLibrary.MediaType.FILE 124 }) 125 albums.push({ 126 albumName: 'Pictures', count: images.length, mediaType: mediaLibrary.MediaType.IMAGE 127 }) 128 albums.push({ 129 albumName: 'Videos', count: videos.length, mediaType: mediaLibrary.MediaType.VIDEO 130 }) 131 albums.push({ 132 albumName: 'Audios', count: audios.length, mediaType: mediaLibrary.MediaType.AUDIO 133 }) 134 return albums 135 } 136 137 deleteFile(media: any) { 138 let uri = media.uri 139 Logger.info(this.tag, `deleteFile,uri = ${uri}`) 140 // @ts-ignore 141 return this.mediaTest.deleteAsset(uri) 142 } 143 144 onDateChange(callback: () => void) { 145 this.mediaTest.on('albumChange', () => { 146 Logger.info(this.tag, 'albumChange called') 147 callback() 148 }) 149 this.mediaTest.on('imageChange', () => { 150 Logger.info(this.tag, 'imageChange called') 151 callback() 152 }) 153 this.mediaTest.on('audioChange', () => { 154 Logger.info(this.tag, 'audioChange called') 155 callback() 156 }) 157 this.mediaTest.on('videoChange', () => { 158 Logger.info(this.tag, 'videoChange called') 159 callback() 160 }) 161 this.mediaTest.on('fileChange', () => { 162 Logger.info(this.tag, 'fileChange called') 163 callback() 164 }) 165 } 166 167 offDateChange() { 168 this.mediaTest.off('albumChange') 169 this.mediaTest.off('imageChange') 170 this.mediaTest.off('audioChange') 171 this.mediaTest.off('videoChange') 172 this.mediaTest.off('fileChange') 173 } 174 175 getInfoFromType(mediaType: number) { 176 let result = { 177 prefix: '', suffix: '', directory: 0 178 } 179 switch (mediaType) { 180 case mediaLibrary.MediaType.FILE: 181 result.prefix = 'FILE_' 182 result.suffix = '.txt' 183 result.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS 184 break 185 case mediaLibrary.MediaType.IMAGE: 186 result.prefix = 'IMG_' 187 result.suffix = '.jpg' 188 result.directory = mediaLibrary.DirectoryType.DIR_IMAGE 189 break 190 case mediaLibrary.MediaType.VIDEO: 191 result.prefix = 'VID_' 192 result.suffix = '.mp4' 193 result.directory = mediaLibrary.DirectoryType.DIR_VIDEO 194 break 195 case mediaLibrary.MediaType.AUDIO: 196 result.prefix = 'AUD_' 197 result.suffix = '.wav' 198 result.directory = mediaLibrary.DirectoryType.DIR_AUDIO 199 break 200 } 201 return result 202 } 203}