1/* 2 * Copyright (c) 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 common from '@ohos.app.ability.common'; 17import photoAccessHelper from '@ohos.file.photoAccessHelper'; 18import fs from '@ohos.file.fs'; 19import Logger from '../utils/Logger'; 20import { promptActionFn } from '../model/DataFactory'; 21import { Options } from '../model/BaseMsg'; 22 23let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; 24 25@Component 26export struct SaveControl { 27 private imageUri: Resource = $r('app.media.photo118'); 28 private mediaUri: string = ''; 29 @Link isShowSaveButton: boolean; 30 31 // 点击保存图片 32 saveImage() { 33 try { 34 context.resourceManager.getMediaContent(this.imageUri.id, async (error, value) => { 35 if (error) { 36 Logger.error(`error is ${error}`); 37 } else { 38 let media = value.buffer; 39 let helper = photoAccessHelper.getPhotoAccessHelper(context); 40 let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'png'); 41 // 通过uri打开媒体库文件 42 let file = fs.openSync(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 43 Logger.info(`openFile success, fd: ${file.fd}`); 44 // 写到媒体库文件中 45 fs.writeSync(file.fd, media); 46 fs.closeSync(file.fd); 47 promptActionFn($r('app.string.save_succeed')); 48 this.isShowSaveButton = false; 49 } 50 }); 51 } catch (error) { 52 this.isShowSaveButton = false; 53 promptActionFn($r('app.string.save_failed')); 54 Logger.error(`callback getMediaContent failed, error code: ${error.code}, message: ${error.message}.`); 55 } 56 } 57 58 // 点击保存视频 59 saveVideo() { 60 try { 61 context.resourceManager.getRawFd(this.mediaUri, async (error, value) => { 62 if (error) { 63 Logger.error(`error is ${JSON.stringify(error)}`); 64 } else { 65 let mediaFd = value.fd; 66 let buffer = new ArrayBuffer(value.length); 67 let options: Options = new Options(value.offset, value.length); 68 let helper = photoAccessHelper.getPhotoAccessHelper(context); 69 let videoUri = await helper.createAsset(photoAccessHelper.PhotoType.VIDEO, 'mp4'); 70 // 通过uri打开媒体库文件 71 let file = fs.openSync(videoUri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 72 fs.readSync(mediaFd, buffer, options); 73 fs.writeSync(file.fd, buffer); 74 fs.closeSync(file.fd); 75 promptActionFn($r('app.string.save_succeed')); 76 this.isShowSaveButton = false; 77 } 78 }); 79 } catch (error) { 80 this.isShowSaveButton = false; 81 promptActionFn($r('app.string.save_failed')); 82 Logger.error(`callback getRawFileContent failed, error code: ${error.code}, message: ${error.message}.`); 83 } 84 } 85 86 async saveMedia() { 87 Logger.info(`saveMedia start`); 88 if (this.mediaUri) { 89 this.saveVideo(); 90 } else { 91 this.saveImage() 92 } 93 } 94 95 build() { 96 SaveButton({ text: SaveDescription.SAVE, buttonType: ButtonType.Capsule }) 97 .fontColor(Color.Black) 98 .fontSize($r('app.integer.layout_size_16')) 99 .padding({ 100 left: $r('app.integer.layout_size_20'), 101 right: $r('app.integer.layout_size_20'), 102 top: $r('app.integer.layout_size_10'), 103 bottom: $r('app.integer.layout_size_10') 104 }) 105 .backgroundColor(Color.White) 106 .onClick(async (event, result) => { 107 if (result === SaveButtonOnClickResult.SUCCESS) { 108 Logger.info('SUCCESS'); 109 this.saveMedia(); 110 } 111 if (result === SaveButtonOnClickResult.TEMPORARY_AUTHORIZATION_FAILED) { 112 Logger.info('TEMPORARY_AUTHORIZATION_FAILED'); 113 } 114 }) 115 116 } 117} 118 119