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