# Cámara y código de barras

> Capturar foto/vídeo con Camera.shot() y leer códigos con CameraBarcode.readBarcode.

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

# Cámara y código de barras

## Capturar una foto — `Camera.shot()`
```java
Camera cam = new Camera();
cam.cameraType = Camera.CameraType.PICKER;      // ⚠️ sin default — siempre defínelo
cam.captureMode = Camera.Preview.PHOTO;

new Thread(() -> {
   String caminho = cam.shot();                 // ruta del archivo, o null si se canceló
   if (caminho == null) return;
   Component.onUI(() -> {
      try { imageView.image(new Image(caminho)); Component.repaint(); }
      catch (Exception e) { Debug.log("erro: " + e); }
   });
}).start();
```
> ⚠️ **`click()` ya no existe** — el método de captura es **`shot()`** (retorna un `String` con la ruta
> o `null` si el usuario cancela).

### Configuración
| Campo | Valores |
|---|---|
| `cameraType` | `DEFAULT` (cámara interna) · `PICKER` (PhotoPicker) · `GALLERY` (galería) — **sin default** |
| `captureMode` | `Preview.PHOTO` · `MUTED_VIDEO` · `AUDIO_VIDEO` |
| `videoQuality` | `AVQuality.HIGH/MEDIUM/LOW` |
| `resolutionWidth`/`Height` (estáticos) | resolución (siempre en LANDSCAPE) |

## Leer código de barras — `CameraBarcode.readBarcode(Image)`
Lee 1D y 2D (QR) de una **imagen** ya capturada (vía ZXing):
```java
Image img = new Image(caminho);
com.google.zxing.Result r = CameraBarcode.readBarcode(img);   // null si no encontró código
if (r != null) {
   String codigo = r.getText();
   Debug.log("Código: " + codigo);
}
```

## Limitaciones reales
- **`Camera.shot()`** abre UI nativa — llámalo **fuera del paint thread** y vuelve con `onUI(...)`.
- **`CameraBarcode.readBarcode` NO es thread-safe** — no lo llames desde varios hilos a la vez.
- Los retornos `null` son normales (canceló / no encontró código) — comprueba siempre.
- En Mac ARM la captura puede retornar `null` (limitación de plataforma).

## Buenas prácticas
- **Siempre** define `cameraType` (no hay default).
- Trata el retorno `null` de `shot()` y de `readBarcode(...)`.
- Para solo elegir de la galería, usa el [PhotoPicker](/docs/ui/widgets/photopicker).

## Errores comunes
- Llamar a `click()` (no existe) en vez de `shot()`.
- No definir `cameraType`.
- Llamar a `readBarcode` de forma concurrente (no es thread-safe).

## Véase también
- [PhotoPicker](/docs/ui/widgets/photopicker) · [Imágenes](/docs/ui/images-and-graphics/images) · [Permisos por plataforma](/docs/platforms)
