• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2022-2023 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 image from '@ohos.multimedia.image'
17import mediaLibrary from '@ohos.multimedia.mediaLibrary'
18import Logger from '../../utils/Logger'
19import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
20import type { Permissions } from '@ohos.abilityAccessCtrl';
21
22/**
23 * 主要封装了mediaLibrary库相关的接口
24 */
25class MediaLibraryManager {
26  requestPermission(context): void {
27    let permissions: Array<Permissions> = [
28      'ohos.permission.READ_MEDIA',
29      'ohos.permission.WRITE_MEDIA'
30    ]
31    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
32    atManager.requestPermissionsFromUser(context, permissions, (code, result) => {
33      Logger.debug('permissionRequest ' + JSON.stringify(code) + ' Result: ' + JSON.stringify(result))
34    })
35  }
36
37  async getPixelMapByFileAsset(fileAsset: mediaLibrary.FileAsset): Promise<image.PixelMap> {
38    if (fileAsset == undefined) {
39      Logger.error('fileAsset undefined')
40      // 异常情况下统一返回undefined,不建议使用null
41      return undefined
42    }
43    Logger.debug('begin getPixelMapByFileAsset:' + fileAsset.displayName)
44    let fd: number = undefined
45    let pixelMap = undefined
46    try {
47      fd = await fileAsset.open('rw')
48      Logger.debug('getPixelMapByFileAsset fd: ' + fd)
49      let imageSource = image.createImageSource(fd)
50      Logger.debug('imageSource: ' + JSON.stringify(imageSource))
51      let decodingOptions = {
52        sampleSize: 1,
53        editable: true,
54        desiredSize: { width: 3000, height: 4000 },
55        rotate: 0,
56        desiredPixelFormat: 3,
57        desiredRegion: { size: { height: 6000, width: 8000 }, x: 0, y: 0 },
58        index: 0
59      }
60      pixelMap = await imageSource.createPixelMap(decodingOptions)
61      Logger.debug('pixel size: ' + pixelMap.getPixelBytesNumber())
62      fileAsset.close(fd)
63    } catch (err) {
64      Logger.debug('err: ' + JSON.stringify(err))
65    }
66    return pixelMap
67  }
68
69  getMediaLibrary(context): mediaLibrary.MediaLibrary {
70    return mediaLibrary.getMediaLibrary(context)
71  }
72
73  async getFileAssets(context, fileType: mediaLibrary.MediaType): Promise<mediaLibrary.FetchFileResult> {
74    Logger.debug('begin getFileAssets, fileType:' + fileType)
75    let fileKeyObj = mediaLibrary.FileKey
76    let imagesFetchOption = {
77      selections: fileKeyObj.MEDIA_TYPE + '= ?',
78      selectionArgs: [fileType.toString()],
79    }
80    let fetchFileResult: mediaLibrary.FetchFileResult = undefined
81    try {
82      fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption)
83      Logger.debug('fetchFileResult count:' + fetchFileResult.getCount())
84    } catch (error) {
85      Logger.error('fetchFileResult Error: ' + JSON.stringify(error))
86    }
87    return fetchFileResult
88  }
89
90  async getFileAssetsByName(context, name: string): Promise<mediaLibrary.FileAsset> {
91    Logger.debug('begin getFileAssetsByName: ' + name)
92    let fileKeyObj = mediaLibrary.FileKey
93    let imagesFetchOption = {
94      selections: fileKeyObj.DISPLAY_NAME + '= ?',
95      selectionArgs: [name.toString()],
96    }
97    let fetchFileResult: mediaLibrary.FetchFileResult = undefined
98    let file: mediaLibrary.FileAsset = undefined
99    try {
100      fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption)
101      Logger.debug('fetchFileResult count:' + fetchFileResult.getCount())
102      file = await fetchFileResult.getFirstObject()
103    } catch (error) {
104      Logger.error('fetchFileResult Error: ' + JSON.stringify(error))
105    }
106    return file
107  }
108
109  async getThumbnail(fileAsset: mediaLibrary.FileAsset): Promise<image.PixelMap> {
110    let thumbnail = undefined
111    try {
112      thumbnail = await fileAsset.getThumbnail()
113      Logger.debug('PixelMap size: ' + thumbnail.getPixelBytesNumber())
114    } catch (error) {
115      Logger.error('getThumbnail Error: ' + JSON.stringify(error))
116    }
117    return thumbnail
118  }
119
120  async createFileAsset(context, mediaType: mediaLibrary.MediaType,
121                        dir: mediaLibrary.DirectoryType, fileName: string): Promise<mediaLibrary.FileAsset> {
122    Logger.debug('createFileAsset: ' + fileName)
123    let media = this.getMediaLibrary(context)
124    let path = await media.getPublicDirectory(dir)
125    return await media.createAsset(mediaType, fileName, path)
126  }
127
128  async deleteFileAsset(fileAsset: mediaLibrary.FileAsset): Promise<void> {
129    Logger.debug('deleteFileAsset:' + fileAsset.displayName);
130    await fileAsset.trash(true);
131  }
132}
133
134export default new MediaLibraryManager()