自学HarmonyOS应用开发(74)- 拍摄照片
相机准备好了之后,就开始实际拍摄照片。首先稍微回退一下,在打开相机时,我们设置了用于保存图像的listener(以下代码的第2行):
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);
}
当用户按下【拍照】按钮时,架构会触发下面的处理:
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方法会被执行:
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
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!