• 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 Logger from '../../utils/Logger';
17import { BusinessError } from '@ohos.base';
18import image from '@ohos.multimedia.image';
19import abilityAccessCtrl from '@ohos.abilityAccessCtrl';
20import type { Permissions } from '@ohos.abilityAccessCtrl';
21import dataSharePredicates from '@ohos.data.dataSharePredicates';
22import userFileManager from '@ohos.filemanagement.userFileManager';
23
24/**
25 * 主要封装了userFileManager库相关的接口
26 */
27class MediaLibraryManager {
28  requestPermission(context): void {
29    let permissions: Array<Permissions> = [
30      'ohos.permission.WRITE_IMAGEVIDEO',
31      'ohos.permission.READ_IMAGEVIDEO',
32      'ohos.permission.FILE_ACCESS_MANAGER',
33      'ohos.permission.READ_AUDIO',
34      'ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY',
35      'ohos.permission.GET_BUNDLE_INFO_PRIVILEGED'
36    ]
37    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
38    atManager.requestPermissionsFromUser(context, permissions, (code, result) => {
39      Logger.debug('permissionRequest ' + JSON.stringify(code) + ' Result: ' + JSON.stringify(result))
40    })
41  }
42
43  async getPixelMapByFileAsset(fileAsset: userFileManager.FileAsset): Promise<image.PixelMap> {
44    if (fileAsset == undefined) {
45      Logger.error('fileAsset undefined')
46      // 异常情况下统一返回undefined,不建议使用null
47      return undefined
48    }
49    Logger.debug('begin getPixelMapByFileAsset:' + fileAsset.displayName)
50    let fd: number = undefined
51    let pixelMap = undefined
52    try {
53      fd = await fileAsset.open('rw')
54      Logger.debug('getPixelMapByFileAsset fd: ' + fd)
55      let imageSource = image.createImageSource(fd)
56      Logger.debug('imageSource: ' + JSON.stringify(imageSource))
57      let decodingOptions = {
58        sampleSize: 1,
59        editable: true,
60        desiredSize: { width: 3000, height: 4000 },
61        rotate: 0,
62        desiredPixelFormat: 3,
63        desiredRegion: { size: { height: 6000, width: 8000 }, x: 0, y: 0 },
64        index: 0
65      }
66      pixelMap = await imageSource.createPixelMap(decodingOptions)
67      Logger.debug('pixel size: ' + pixelMap.getPixelBytesNumber())
68      fileAsset.close(fd)
69    } catch (err) {
70      Logger.debug('err: ' + JSON.stringify(err))
71    }
72    return pixelMap
73  }
74
75
76  async getFileAssets(context, fileType: userFileManager.FileType): Promise<userFileManager.FetchResult<userFileManager.FileAsset>> {
77    let mgr = userFileManager.getUserFileMgr(context);
78    let fileKeyObj = userFileManager.ImageVideoKey;
79    let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
80    let fetchOptions: userFileManager.FetchOptions = {
81      fetchColumns: [],
82      predicates: predicates.equalTo(fileKeyObj.FILE_TYPE.toString(), fileType)
83    };
84    let fetchResult: userFileManager.FetchResult<userFileManager.FileAsset>;
85    if (fileType === userFileManager.FileType.IMAGE || fileType === userFileManager.FileType.VIDEO) {
86      fetchResult = await mgr.getPhotoAssets(fetchOptions);
87    } else if (fileType === userFileManager.FileType.AUDIO) {
88      fetchResult = await mgr.getAudioAssets(fetchOptions);
89    }
90    return fetchResult;
91  }
92
93  async getFileAssetsByName(context, name: string): Promise<userFileManager.FileAsset> {
94    let mgr = userFileManager.getUserFileMgr(context);
95    Logger.debug('begin getFileAssetsByName: ' + name);
96    let fileKeyObj = userFileManager.ImageVideoKey;
97    let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
98    let fetchOptions: userFileManager.FetchOptions = {
99      fetchColumns: [],
100      predicates: predicates.equalTo(fileKeyObj.DISPLAY_NAME.toString(), name.toString())
101    };
102    let fetchResult: userFileManager.FetchResult<userFileManager.FileAsset>;
103    let file: userFileManager.FileAsset = undefined;
104    try {
105      fetchResult = await mgr.getPhotoAssets(fetchOptions);
106      file = await fetchResult.getFirstObject();
107    } catch (error) {
108      Logger.error('fetchFileResult Error: ' + JSON.stringify(error));
109    }
110    return file;
111  }
112
113  async getThumbnail(fileAsset: userFileManager.FileAsset): Promise<image.PixelMap> {
114    let thumbnail: image.PixelMap = undefined;
115    await fileAsset.getThumbnail().then((pixelMap) => {
116      thumbnail = pixelMap;
117      Logger.info('getThumbnail successful ' + pixelMap);
118    }).catch((err: BusinessError) => {
119      Logger.error('getThumbnail fail' + err);
120    });
121    return thumbnail;
122  }
123
124  async createFileAsset(context, mediaType: userFileManager.FileType, fileName: string): Promise<userFileManager.FileAsset> {
125    Logger.debug('createFileAsset: ' + fileName);
126    let mgr = userFileManager.getUserFileMgr(context);
127    if (mediaType === 1 || mediaType === 2) {
128      let fileAsset: userFileManager.FileAsset = undefined;
129      try {
130        let createOption: userFileManager.PhotoCreateOptions = {
131          subType: userFileManager.PhotoSubType.DEFAULT
132        }
133        fileAsset = await mgr.createPhotoAsset(fileName, createOption);
134        Logger.info('createPhotoAsset successfully file displayName' + fileAsset.displayName);
135      } catch (err) {
136        Logger.error('createPhotoAsset failed, message = ', err);
137      }
138      return fileAsset;
139    } else if (mediaType === 3) {
140      let fileAsset: userFileManager.FileAsset = undefined;
141      try {
142        fileAsset = await mgr.createAudioAsset(fileName);
143      } catch (err) {
144        Logger.error('createAudioAsset failed, message = ', err);
145      }
146      return fileAsset;
147    }
148  }
149
150  async deleteFileAsset(context, fileAsset: userFileManager.FileAsset): Promise<void> {
151    try {
152      let mgr = userFileManager.getUserFileMgr(context);
153      await mgr.delete(fileAsset.uri);
154      Logger.info('delete successfully');
155    } catch (err) {
156      Logger.error('delete failed with error: ' + err);
157    }
158  }
159}
160
161export default new MediaLibraryManager()