前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自学HarmonyOS应用开发(74)- 拍摄照片

自学HarmonyOS应用开发(74)- 拍摄照片

作者头像
面向对象思考
发布2021-11-09 15:08:43
3490
发布2021-11-09 15:08:43
举报

断更有一段时间,今天继续。

相机准备好了之后,就开始实际拍摄照片。首先稍微回退一下,在打开相机时,我们设置了用于保存图像的listener(以下代码的第2行):

代码语言:javascript
复制
代码语言:javascript
复制
private void openCamera() {
    imageReceiver = ImageReceiver.create(SCREEN_WIDTH, SCREEN_HEIGHT, ImageFormat.JPEG, IMAGE_RCV_CAPACITY);
    imageReceiver.setImageArrivalListener(this::saveImage);
    CameraKit cameraKit = CameraKit.getInstance(getApplicationContext());
    String[] cameraList = cameraKit.getCameraIds();
    String cameraId = cameraList.length > 1 && isCameraFront ? cameraList[1] : cameraList[0];
    CameraStateCallbackImpl cameraStateCallback = new CameraStateCallbackImpl();
    cameraKit.createCamera(cameraId, cameraStateCallback, eventHandler);
}

当用户按下【拍照】按钮时,架构会触发下面的处理:

代码语言:javascript
复制
代码语言:javascript
复制
private void takeSingleCapture(Component component) {
    if (cameraDevice == null || imageReceiver == null) {
        return;
    }
    FrameConfig.Builder framePictureConfigBuilder = cameraDevice.getFrameConfigBuilder(FRAME_CONFIG_PICTURE);
    framePictureConfigBuilder.addSurface(imageReceiver.getRecevingSurface());
    FrameConfig pictureFrameConfig = framePictureConfigBuilder.build();
    cameraDevice.triggerSingleCapture(pictureFrameConfig);
}

代码第8行会调用cameraDevice的triggerSingleCapture方法。如果方法被成功执行,下面的saveImage方法会被执行:

代码语言:javascript
复制
代码语言:javascript
复制
private void saveImage(ImageReceiver receiver) {
    File saveFile = new File(getFilesDir(), "IMG_" + System.currentTimeMillis() + ".jpg");
    ohos.media.image.Image image = receiver.readNextImage();
    ohos.media.image.Image.Component component = image.getComponent(ImageFormat.ComponentType.JPEG);
    byte[] bytes = new byte[component.remaining()];
    component.read(bytes);
    try (FileOutputStream output = new FileOutputStream(saveFile)) {
        output.write(bytes);
        output.flush();
        showTips(this, "Take photo succeed");
    } catch (IOException e) {
        HiLog.error(LABEL_LOG, "%{public}s", "saveImage IOException");
    }
}

如果一切顺利,就可以看到第10行代码显示的"Take photo succeed"提示。就像下面的视频这样:

到目前为止的内容完全出自于华为的示例代码。需要注意的是,这段代码只能在真机上运行。

参考资料

相机示例代码

https://gitee.com/openharmony/app_samples/tree/master/media/Camera

权限开发概述

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-overview-0000000000029883

权限开发指导

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-guidelines-0000000000029886

应用权限列表

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/security-permissions-available-0000001051089272

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面向对象思考 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档