# Câmera e código de barras

> Capturar foto/vídeo com Camera.shot() e ler códigos com CameraBarcode.readBarcode.

Source: https://crossfly.dev/pt/docs/data-and-services/device-camera — CrossFly documentation. Full docs as one file: https://crossfly.dev/llms-full.txt

# Câmera e código de barras

## Capturar uma foto — `Camera.shot()`
```java
Camera cam = new Camera();
cam.cameraType = Camera.CameraType.PICKER;      // ⚠️ sem default — sempre defina
cam.captureMode = Camera.Preview.PHOTO;

new Thread(() -> {
   String caminho = cam.shot();                 // caminho do arquivo, ou null se cancelado
   if (caminho == null) return;
   Component.onUI(() -> {
      try { imageView.image(new Image(caminho)); Component.repaint(); }
      catch (Exception e) { Debug.log("erro: " + e); }
   });
}).start();
```
> ⚠️ **`click()` não existe mais** — o método de captura é **`shot()`** (retorna `String` com o caminho
> ou `null` se o usuário cancelar).

### Configuração
| Campo | Valores |
|---|---|
| `cameraType` | `DEFAULT` (câmera interna) · `PICKER` (PhotoPicker) · `GALLERY` (galeria) — **sem default** |
| `captureMode` | `Preview.PHOTO` · `MUTED_VIDEO` · `AUDIO_VIDEO` |
| `videoQuality` | `AVQuality.HIGH/MEDIUM/LOW` |
| `resolutionWidth`/`Height` (estáticos) | resolução (sempre em LANDSCAPE) |

## Ler código de barras — `CameraBarcode.readBarcode(Image)`
Lê 1D e 2D (QR) de uma **imagem** já capturada (via ZXing):
```java
Image img = new Image(caminho);
com.google.zxing.Result r = CameraBarcode.readBarcode(img);   // null se não achou código
if (r != null) {
   String codigo = r.getText();
   Debug.log("Código: " + codigo);
}
```

## Limitações reais
- **`Camera.shot()`** abre UI nativa — chame **fora da paint thread** e volte com `onUI(...)`.
- **`CameraBarcode.readBarcode` NÃO é thread-safe** — não chame de várias threads ao mesmo tempo.
- Retornos `null` são normais (cancelou / não achou código) — sempre cheque.
- Em Mac ARM a captura pode retornar `null` (limitação de plataforma).

## Boas práticas
- **Sempre** defina `cameraType` (não há default).
- Trate o retorno `null` de `shot()` e de `readBarcode(...)`.
- Para só escolher da galeria, use o [PhotoPicker](/docs/ui/widgets/photopicker).

## Erros comuns
- Chamar `click()` (não existe) em vez de `shot()`.
- Não definir `cameraType`.
- Chamar `readBarcode` concorrentemente (não é thread-safe).

## Veja também
- [PhotoPicker](/docs/ui/widgets/photopicker) · [Imagens](/docs/ui/images-and-graphics/images) · [Permissões por plataforma](/docs/platforms)
