• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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