跳到内容
CrossFly 是 100% 开源在 GitHub 关注我们
CrossFlyCrossFly
开始使用

本页面由葡萄牙语机器翻译,可能存在错误。葡萄牙语版本为准。

相机与条形码

拍摄一张照片 —— Camera.shot()

Camera cam = new Camera();
cam.cameraType = Camera.CameraType.PICKER;      // ⚠️ 无默认值 — 务必设置
cam.captureMode = Camera.Preview.PHOTO;

new Thread(() -> {
   String caminho = cam.shot();                 // 文件路径,取消则为 null
   if (caminho == null) return;
   Component.onUI(() -> {
      try { imageView.image(new Image(caminho)); Component.repaint(); }
      catch (Exception e) { Debug.log("erro: " + e); }
   });
}).start();

⚠️ click() 不再存在 —— 捕获方法是 shot()(返回带路径的 String, 若用户取消则返回 null)。

配置

字段 取值
cameraType DEFAULT(内部相机) · PICKER(PhotoPicker) · GALLERY(相册) —— 无默认值
captureMode Preview.PHOTO · MUTED_VIDEO · AUDIO_VIDEO
videoQuality AVQuality.HIGH/MEDIUM/LOW
resolutionWidth/Height(静态) 分辨率(始终为 LANDSCAPE 横向)

读取条形码 —— CameraBarcode.readBarcode(Image)

从已捕获的图像中读取 1D 和 2D(QR)码(通过 ZXing):

Image img = new Image(caminho);
com.google.zxing.Result r = CameraBarcode.readBarcode(img);   // 未找到编码则为 null
if (r != null) {
   String codigo = r.getText();
   Debug.log("Código: " + codigo);
}

实际限制

  • Camera.shot() 会打开原生 UI —— 请在绘制线程之外调用,并用 onUI(...) 返回。
  • CameraBarcode.readBarcode 不是线程安全的 —— 不要同时从多个线程调用。
  • 返回 null 是正常的(取消 / 未找到码)—— 请始终检查。
  • 在 Mac ARM 上捕获可能返回 null(平台限制)。

最佳实践

  • 始终设置 cameraType(没有默认值)。
  • 处理 shot() 和 readBarcode(...) 的 null 返回。
  • 若只想从相册选择,请使用 PhotoPicker。

常见错误

  • 调用 click()(不存在)而非 shot()。
  • 未设置 cameraType。
  • 并发调用 readBarcode(非线程安全)。

另见

这个页面有帮助吗?