Il metodo getSnapshot()
accetta, in ingresso, un parametro stringa che indica le caratteristiche e il formato dell'immagine che viene catturata (ricordiamoci che con System.getProperty("video.snapshot.encodings")
possiamo determinare quali formati supporta il terminale). Se viene passato null il formato dell'immagine sarà quello di default e cioè PNG.
Quando si accede alla funzionalità di cattura immagini della fotocamera, così come in altre situazioni (accesso alla rete, invio o ricezione messaggi, accesso alle info personali dell'utente, ecc.), ci viene richiesto di confermare la scelta.
Questo perchè le applicazioni J2ME, che non sono autenticate dai rispettivi produttori dei terminali, vengono eseguite in una cosiddetta "sandbox" che ne regola l'accesso alle funzioni del telefono (in tal modo si impedisce che una midlet possa accedere, ad esempio, alla rete all'insaputa dell'utente).
Nelle applicazioni commerciali queste schermate di conferma possono essere evitate facendo "validare" la midlet direttamente dai produttori dei vari terminali.
Dopo aver catturato la foto (memorizzata nell'array di byte) è possibile visualizzarla nel Canvas (viene chiamato, a tale scopo, il metodo showCapturedPhoto()
di FotoDemo), che crea l'immagine dall'array di byte ottenuto dalla cattura dello snapshot.
public void showCapturedPhoto(byte[] image)
{
photoCanvas.stopPlayer();
Image imageCaptured = Image.createImage(image, 0, image.length - 1);
photoCanvas.showImage(imageCaptured);
}
Listato 31. stoppa il Player e ridisegna la schermata di PhotoCanvas
public void stopPlayer()
{
if (playerActive)
{
try
{
player.stop();
vc.setVisible(false);
playerActive = false;
}
catch (MediaException e)
{
e.printStackTrace();
}
}
}
public void showImage(Image image)
{
imageCaptured = image;
addCommand(back);
repaint();
}
Una volta visualizzata l'immagine si potrebbe salvarla in memoria (nell'RMS per costruire un proprio album fotografico) oppure si può tornare alla cattura di una nuova immagine (grazie al riavvio del Player ancora tramite startPlayer()
di PhotoCanvas()
).
Scoprire altre funzionalità del terminale
Il metodo getProperty()
della classe System permette di capire se il terminale sul quale dobbiamo eseguire una midlet supporta determinate funzioni.
Le chiavi da passare come parametro sono le seguenti:
- supports.mixing: "true", significa che almeno due toni possono essere riprodotti con l'istruzione
Manager.playTone()
e almeno due player possono riprodurre audio simultaneamente; - supports.audio.capture: ritorna "true" o "false" a seconda che il telefona supporti o meno la cattura dell'audio;
- supports.video.capture: ritorna "true" o "false" a seconda che il telefona supporti o meno la cattura di clip video;
- supports.recording: ritorna "true" o "false" a seconda che il telefona supporti o meno la registrazione audio;
- audio.encodings: ritorna la stringa che descrive i dettagli del formato audio che il terminale può catturare;
- video.encodings: ritorna la stringa che descrive i dettagli del formato video che il terminale può catturare.