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