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()