• 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 './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}