Esta página fue traducida automáticamente del portugués y puede contener errores. La versión en portugués es la canónica.
Cómo tomar una foto y obtener la ruta del archivo
Propósito. Abrir la cámara, tomar una foto y recibir la ruta del archivo JPEG grabado.
La forma recomendada es usar Camera con cameraType = CameraType.PICKER, que por debajo abre el
PhotoPicker (la UI de captura del propio framework) y devuelve la ruta — o null si se cancela.
APIs usadas
Camera— constructor sin argumentos; campos públicoscameraType(CameraType),captureMode(Preview, por defectoPHOTO),videoQuality(AVQuality),videoTimeLimit.Camera.shot()→String— toma la foto/video según los campos y devuelve la ruta del archivo onull(cancelado, error, o macOS ARM). No existe el métodoclick().CameraType(enum) —DEFAULT(cámara nativa del SO),PICKER(UI de CrossFly víaPhotoPicker),GALLERY(elegir de la galería).PhotoPicker(Preview type)— usado internamente porshot()cuandocameraType == PICKER; exponegetAnswer()(ruta o cadena de error) eisError().Camera.shot()ya convierte el error ennullpor ti.
Divergencia/nota de honestidad.
PhotoPickerno es abstracto y no usa el callbackonAnswer: graba el resultado engetAnswer()y señaliza el fallo enisError().Camera.shot()encapsula ese flujo (show()→ leegetAnswer()→isError() ? null : ret), así que prefiereshot(). En iOS, cuandocaptureMode != PHOTO,shot()delega directamente a la cámara nativa del SO.
Ejemplo completo (copiar, pegar y ejecutar)
package com.exemplo;
import dev.crossfly.ui.*; // Window, Component, Button, Label, UIConstants
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.device.*; // Camera
/** Pantalla principal ejecutable. Apunta el launcher (classname) y corre: gradlew :lwjgl3:run */
public class MainWindow extends Window
{
@Override
public void onShow() throws Exception
{
super.onShow();
setLayout(new VerticalLayout());
Label resultado = new Label("");
add(LAY_AUTO, resultado);
Button acao = new Button("Tirar foto");
acao.onAction(c ->
{
// shot() es bloqueante mientras el picker está abierto; ejecuta fuera de la paint thread.
new Thread(() ->
{
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de captura de CrossFly
cam.captureMode = UIConstants.Preview.PHOTO; // foto (default)
String path = cam.shot(); // ruta del JPEG, o null si se canceló/error
// El retorno llega FUERA de la paint thread → vuelve a la UI con onUI(...)
Component.onUI(() ->
resultado.setText(path != null ? "Foto: " + path : "Cancelado ou erro"));
}).start();
});
add(LAY_AUTO, acao);
}
}
El fragmento de abajo muestra solo el núcleo. Para ejecutarlo, colócalo en el esqueleto
MainWindowde arriba.
Fragmento mínimo
// verificado en la fuente: Camera.java shot() (líneas 75-91); PhotoPicker.java (constructor + getAnswer/isError)
import dev.crossfly.device.*; // Camera
import dev.crossfly.ui.*; // Component (onUI), UIConstants.CameraType/Preview
// shot() es bloqueante mientras el picker está abierto; ejecuta fuera de la paint thread.
new Thread(() -> {
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de captura de CrossFly
cam.captureMode = UIConstants.Preview.PHOTO; // foto (default)
String path = cam.shot(); // ruta del JPEG, o null si se canceló/error
// El retorno llega FUERA de la paint thread → vuelve a la UI con onUI(...)
Component.onUI(() -> {
if (path != null)
mostrarFoto(path); // ej.: cargar la Image y mostrarla en un ImageView
// else: el usuario canceló o hubo un error de cámara
});
}).start();
Profundiza
- Guía de la cámara: Cámara del dispositivo · Widget: PhotoPicker
- Receta hermana: gravar-video.md · ler-codigo-de-barras.md