Como tirar uma foto e obter o caminho do arquivo
Propósito. Abrir a câmera, tirar uma foto e receber o caminho do arquivo JPEG gravado.
A forma recomendada é usar Camera com cameraType = CameraType.PICKER, que por baixo abre o
PhotoPicker (a UI de captura do próprio framework) e retorna o caminho — ou null se cancelado.
APIs usadas
Camera— construtor sem argumentos; campos públicoscameraType(CameraType),captureMode(Preview, defaultPHOTO),videoQuality(AVQuality),videoTimeLimit.Camera.shot()→String— tira a foto/vídeo conforme os campos e retorna o caminho do arquivo ounull(cancelado, erro, ou macOS ARM). Não existe métodoclick().CameraType(enum) —DEFAULT(câmera nativa do SO),PICKER(UI do CrossFly viaPhotoPicker),GALLERY(escolher da galeria).PhotoPicker(Preview type)— usado internamente porshot()quandocameraType == PICKER; expõegetAnswer()(caminho ou string de erro) eisError().Camera.shot()já converte erro emnullpara você.
Divergência/nota de honestidade.
PhotoPickernão é abstrato e não usa callbackonAnswer: ele grava o resultado emgetAnswer()e sinaliza falha emisError().Camera.shot()encapsula esse fluxo (show()→ lêgetAnswer()→isError() ? null : ret), então prefirashot(). No iOS, quandocaptureMode != PHOTO,shot()delega direto para a câmera nativa do SO.
Exemplo completo (copiar, colar e rodar)
package com.exemplo;
import dev.crossfly.ui.*; // Window, Component, Button, Label, UIConstants
import dev.crossfly.ui.layout.*; // VerticalLayout
import dev.crossfly.device.*; // Camera
/** Tela principal executável. Aponte o launcher (classname) e rode: 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() é bloqueante enquanto o picker está aberto; rode fora da paint thread.
new Thread(() ->
{
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de captura do CrossFly
cam.captureMode = UIConstants.Preview.PHOTO; // foto (default)
String path = cam.shot(); // caminho do JPEG, ou null se cancelado/erro
// O retorno chega FORA da paint thread → volte à UI com onUI(...)
Component.onUI(() ->
resultado.setText(path != null ? "Foto: " + path : "Cancelado ou erro"));
}).start();
});
add(LAY_AUTO, acao);
}
}
O trecho abaixo mostra só o miolo. Para rodar, coloque-o no esqueleto
MainWindowacima.
Trecho mínimo
// verificado na fonte: Camera.java shot() (linhas 75-91); PhotoPicker.java (constructor + getAnswer/isError)
import dev.crossfly.device.*; // Camera
import dev.crossfly.ui.*; // Component (onUI), UIConstants.CameraType/Preview
// shot() é bloqueante enquanto o picker está aberto; rode fora da paint thread.
new Thread(() -> {
Camera cam = new Camera();
cam.cameraType = UIConstants.CameraType.PICKER; // UI de captura do CrossFly
cam.captureMode = UIConstants.Preview.PHOTO; // foto (default)
String path = cam.shot(); // caminho do JPEG, ou null se cancelado/erro
// O retorno chega FORA da paint thread → volte à UI com onUI(...)
Component.onUI(() -> {
if (path != null)
mostrarFoto(path); // ex.: carregar a Image e exibir num ImageView
// else: usuário cancelou ou houve erro de câmera
});
}).start();
Aprofunde-se
- Guia da câmera: Câmera do dispositivo · Widget: PhotoPicker
- Receita irmã: gravar-video.md · ler-codigo-de-barras.md
Esta página foi útil?Obrigado pelo feedback!