JoeDevCamera 扩展:在布局中显示相机预览,程序控制拍照与录像

« 返回首页

JoeDevCamera 扩展

在布局组件中直接显示相机预览,用积木控制拍照和录制视频,无需打开系统相机应用。

下载

joejsanz.joedevcamera.aix(v1.0)

Camera.aia - 原作者示例项目

基本信息

  • 版本:v1.0(本站分发版本)
  • 发布时间:2025-09-04
  • JDK:11
  • 最低 API 级别:21
  • 构建方式:FAST-CLI v4.3.1

截图

宽高比 1:1

宽高比 1:1

宽高比 3:4

宽高比 3:4

宽高比 9:16

宽高比 9:16

全屏

全屏

原作者提示:把布局的高度设为 70%,可以得到更标准的相机尺寸;作者还计划提供单独的扩展,自动实现 1:1、3:4、9:16 的宽高比。

权限要求

初始化时必须授予以下权限:

权限积木 1

权限积木 2

方法

StartCamera启动相机(布局)
启动相机并在布局中显示预览。
  • 布局:要在其中显示相机预览的布局组件
StopCamera停止相机()
停止相机并释放资源。
SwitchCamera切换摄像头()
在前置和后置摄像头之间切换。
TakePicture拍照()
拍摄照片并自动保存。
SetZoomLevel设置缩放级别(级别)
调整缩放级别(1-10)。也可以不使用此方法,直接在屏幕上双指捏合进行缩放。
GetZoomLevel获取缩放级别()
获取当前缩放级别。
GetMaxZoomLevel获取最大缩放级别()
获取可用的最大缩放值。
FocusOnPoint对焦到指定点(x,y)
对屏幕上的指定点对焦(x、y 取 0 到 1 之间)。
CaptureAndGetPath拍照并获取路径()
拍摄一张照片并返回文件路径。
StartRecording开始录像()
开始录制视频。
StopRecording停止录像()
停止录制视频。
IsCameraActive相机是否已启动()
检查相机是否处于启动状态。
CameraResolution获取相机分辨率()
获取当前相机分辨率。
HasFlash是否有闪光灯()
检查设备是否有闪光灯。
AvailableCamerasCount获取可用摄像头数量()
获取可用摄像头的数量。
IsRecording是否正在录像()
检查当前是否正在录制视频。

事件

PictureTaken拍照完成时(照片路径)
照片拍摄成功后触发,返回保存的文件路径。
PictureError拍照出错时(错误信息)
拍照过程中发生错误时触发。
CameraReady相机就绪时()
相机准备就绪时触发。
CameraSwitched摄像头切换时(新摄像头ID)
摄像头切换完成时触发,返回切换后的摄像头 ID。
FocusedOnPoint点按对焦完成时(x,y)
对触摸点对焦完成时触发,返回对焦点的坐标。
RecordingStarted开始录像时(视频路径)
视频录制开始时触发,返回视频的保存路径。
RecordingStopped录像停止时(视频路径)
视频录制停止时触发,返回视频的保存路径。
RecordingError录像出错时(错误信息)
视频录制过程中发生错误时触发。
ZoomChanged缩放变化时(缩放级别,缩放系数)
缩放级别变化时触发,无论是通过手势还是通过积木设置。
ZoomEnded缩放结束时(缩放级别,缩放系数)
用户结束缩放操作时触发(松开屏幕或结束双指捏合)。

属性

CameraId摄像头 ID
要使用的摄像头 ID(0:后置,1:前置)。
FlashEnabled闪光灯开关
打开或关闭相机闪光灯。
AutoFocusEnabled自动对焦开关
打开或关闭自动对焦。
TouchToFocusEnabled触摸对焦开关
打开或关闭触摸对焦。开启后,触摸屏幕上的指定点即可对焦。
JpegQuality照片质量
照片的 JPEG 质量(0-100)。
SaveDirectory保存目录
照片的保存目录。目前仅支持保存到 Pictures(图片)目录。
CaptureSoundEnabled拍照提示音开关
拍照时打开或关闭快门声。
VideoBitrate视频码率
视频码率(比特每秒)。
VideoFrameRate视频帧率
视频的每秒帧率。
FocusFrameColor对焦框颜色
对焦框的颜色。
FocusFrameDisappearanceTime对焦框消失时间
对焦框的消失时间(毫秒)。
FocusFrameSize对焦框大小
对焦框的大小。

使用示例

以下示例假设已在设计视图中添加:一个用于显示相机预览的垂直布局、若干个按钮和一个标签

启动相机并拍照

when Screen1.Initialize() {
  JoeDevCamera1.StartCamera(垂直布局1)
}

when 按钮_拍照.Click() {
  JoeDevCamera1.TakePicture()
}

when JoeDevCamera1.PictureTaken(imagePath) {
  标签_状态.Text = imagePath
}

录制视频(一个按钮切换开始/停止)

when 按钮_录像.Click() {
  if JoeDevCamera1.IsRecording() {
    JoeDevCamera1.StopRecording()
  } else {
    JoeDevCamera1.StartRecording()
  }
}

when JoeDevCamera1.RecordingStarted(videoPath) {
  标签_状态.Text = join("开始录像:", videoPath)
}

when JoeDevCamera1.RecordingStopped(videoPath) {
  标签_状态.Text = join("已保存:", videoPath)
}

变焦

when 按钮_放大.Click() {
  JoeDevCamera1.SetZoomLevel(JoeDevCamera1.GetZoomLevel() + 1)
}

when JoeDevCamera1.ZoomChanged(zoomLevel, zoomFactor) {
  标签_状态.Text = join("当前缩放:", zoomLevel)
}

切换前后摄像头

when 按钮_切换.Click() {
  JoeDevCamera1.SwitchCamera()
}

when JoeDevCamera1.CameraSwitched(newCameraId) {
  if newCameraId == 0 {
    标签_状态.Text = "后置摄像头"
  } else {
    标签_状态.Text = "前置摄像头"
  }
}

when JoeDevCamera1.FocusedOnPoint(x, y) {
  标签_状态.Text = "对焦完成"
}

版本更新

原作者已于 2026-03-07 发布 v1.1(更新内容如下)。本页 API 以上方本站分发的 v1.0 为准;如需 v1.1,请到原帖下载最新附件。

  • 新增了一个检查相机权限是否已授予的方法(HasCameraPermission)。
  • PictureTaken 事件新增了一个参数,用于接收所拍照片的 content URI。
  • 使用伴侣(Companion)测试时,现在可以把 imagePath 放到图像组件里直接查看拍到的照片。

版权信息

本文档内容依据原作者发布页面整理翻译,版权归原作者所有。

  • 原作者:Joe J. Sánchez(Joejsanz)
  • 原始网址:https://community.appinventor.mit.edu/t/camera-displays-the-camera-to-take-photos-and-record-videos-in-an-arrangement/154998
  • 发布日期:2025年9月4日
文档反馈