• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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}