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' 19 20/** 21 * 主要封装了mediaLibrary库相关的接口 22 */ 23class MediaLibraryManager { 24 requestPermission(context): void { 25 let permissions = [ 26 'ohos.permission.READ_MEDIA', 27 'ohos.permission.WRITE_MEDIA' 28 ] 29 context.requestPermissionsFromUser(permissions, (code, result) => { 30 Logger.debug('permissionRequest ' + JSON.stringify(code) + ' Result: ' + JSON.stringify(result)) 31 }) 32 } 33 34 async getPixelMapByFileAsset(fileAsset: mediaLibrary.FileAsset): Promise<image.PixelMap> { 35 if (fileAsset == undefined) { 36 Logger.error('fileAsset undefined') 37 // 异常情况下统一返回undefined,不建议使用null 38 return undefined 39 } 40 Logger.debug('begin getPixelMapByFileAsset:' + fileAsset.displayName) 41 let fd: number = undefined 42 let pixelMap = undefined 43 try { 44 fd = await fileAsset.open('rw') 45 Logger.debug('getPixelMapByFileAsset fd: ' + fd) 46 let imageSource = image.createImageSource(fd) 47 Logger.debug('imageSource: ' + JSON.stringify(imageSource)) 48 pixelMap = await imageSource.createPixelMap() 49 Logger.debug('pixel size: ' + pixelMap.getPixelBytesNumber()) 50 fileAsset.close(fd) 51 } catch (err) { 52 Logger.debug('err: ' + JSON.stringify(err)) 53 } 54 return pixelMap 55 } 56 57 getMediaLibrary(context): mediaLibrary.MediaLibrary { 58 return mediaLibrary.getMediaLibrary(context) 59 } 60 61 async getFileAssets(context, fileType: mediaLibrary.MediaType): Promise<mediaLibrary.FetchFileResult> { 62 Logger.debug('begin getFileAssets, fileType:' + fileType) 63 let fileKeyObj = mediaLibrary.FileKey 64 let imagesFetchOption = { 65 selections: fileKeyObj.MEDIA_TYPE + '= ?', 66 selectionArgs: [fileType.toString()], 67 } 68 let fetchFileResult: mediaLibrary.FetchFileResult = undefined 69 try { 70 fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption) 71 Logger.debug('fetchFileResult count:' + fetchFileResult.getCount()) 72 } catch (error) { 73 Logger.error('fetchFileResult Error: ' + JSON.stringify(error)) 74 } 75 return fetchFileResult 76 } 77 78 async getFileAssetsByName(context, name: string): Promise<mediaLibrary.FileAsset> { 79 Logger.debug('begin getFileAssetsByName: ' + name) 80 let fileKeyObj = mediaLibrary.FileKey 81 let imagesFetchOption = { 82 selections: fileKeyObj.DISPLAY_NAME + '= ?', 83 selectionArgs: [name.toString()], 84 } 85 let fetchFileResult: mediaLibrary.FetchFileResult = undefined 86 let file: mediaLibrary.FileAsset = undefined 87 try { 88 fetchFileResult = await this.getMediaLibrary(context).getFileAssets(imagesFetchOption) 89 Logger.debug('fetchFileResult count:' + fetchFileResult.getCount()) 90 file = await fetchFileResult.getFirstObject() 91 } catch (error) { 92 Logger.error('fetchFileResult Error: ' + JSON.stringify(error)) 93 } 94 return file 95 } 96 97 async getThumbnail(fileAsset: mediaLibrary.FileAsset): Promise<image.PixelMap> { 98 let thumbnail = undefined 99 try { 100 thumbnail = await fileAsset.getThumbnail() 101 Logger.debug('PixelMap size: ' + thumbnail.getPixelBytesNumber()) 102 } catch (error) { 103 Logger.error('getThumbnail Error: ' + JSON.stringify(error)) 104 } 105 return thumbnail 106 } 107 108 async createFileAsset(context, mediaType: mediaLibrary.MediaType, 109 dir: mediaLibrary.DirectoryType, fileName: string): Promise<mediaLibrary.FileAsset> { 110 Logger.debug('createFileAsset: ' + fileName) 111 let media = this.getMediaLibrary(context) 112 let path = await media.getPublicDirectory(dir) 113 return await media.createAsset(mediaType, fileName, path) 114 } 115 116 async deleteFileAsset(context, fileAsset: mediaLibrary.FileAsset) { 117 Logger.debug(`deleteFileAsset: ${fileAsset.displayName}, uri: ${fileAsset.uri}`) 118 let media = this.getMediaLibrary(context) 119 await media.deleteAsset(fileAsset.uri) 120 } 121} 122 123export default new MediaLibraryManager()