Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Catturare foto e immagini

Usare la fotocamera del terminale mobile per scattare foto e catturare immagini
Usare la fotocamera del terminale mobile per scattare foto e catturare immagini
Link copiato negli appunti

In questa lezione vedremo come si possono catturare immagini dalla fotocamera del terminale e come si possono visualizzare in una schermata Canvas.

Non tutti i terminali, nonostante siano dotati di una propria cam, consentono l'accesso e il controllo a un'applicazione J2ME.

Inizieremo con il verificare se il nostro terminale supporta la cattura di foto.

Nel creare il progetto, tramite il WTK, ci si deve ricordare di selezionare la casella relativa a Mobile Media API (JSR 135) nella schermata "Settings for Project".

Verificare la funzionalità di cattura

Per verificare il supporto della cattura di immagini, dalla fotocamera, si può utilizzare il metodo getProperty() della classe System. Questo metodo, utilizzando come parametro la chiave che identifica la funzionalità da verificare, fornisce un modo per conoscere le funzionalità del nostro telefono e determinare se certe applicazioni sono eseguibili o meno su un determinato modello.

Il metodo getProperty ritorna una stringa se la proprietà è supportata, null viceversa.

Nel caso specifico, la proprietà da controllare è video.snapshot.encodings che ci permette di rilevare una stringa che elenca le codifiche delle immagini catturate dalla fotocamera; ovviamente otterremo null se il terminale non supporta la funzione fotografica:

String value = System.getProperty("video.snapshot.encodings");
System.out.println("Encodings capture: "+value);

Eseguendo il codice, nel WTK, il risultato che otteniamo è la stringa "encoding=jpeg encoding=png": ciò significa che possiamo catturare immagini codificandole sia in jpg che in png.

Se la stringa che ci viene ritornata è null, possiamo far visualizzare all'utente un'alert che indica la mancanza della cattura di foto sul suo telefono.

Alert alert = new Alert("Peccato ma il tuo terminale non supporta la cattura di foto");
display.setCurrent(alert);

Avviare la visualizzazione dalla fotocamera

Se il test precedente ha dato esito positivo, possiamo procedere alla creazione dell'interfaccia che consente di scattare la foto.

Il metodo buildPlayer della classe PhotoCanvas inizializza il solito oggetto Player (già visto nelle sezioni precedenti) ma utilizzando "capture" come protocollo per il metodo createPlayer().

Listato 27. Interfaccia per scattare la foto (Vedi codice completo)

..//
    public void buildPlayer()
    {
        try
        {
            player=Manager.createPlayer("capture://video");
            player.realize();
            vc=(VideoControl)(player.getControl("VideoControl"));
            if (vc == null)
            {
                // Il videocontrol non può essere creato.
                throw new MediaException("Video control not supported");
            }
            else
            {
                vc.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,this);
                
                int vcWidth = vc.getDisplayWidth();
                int vcHeight = vc.getDisplayHeight();
                
                int x = (canvasWidth - vcWidth)/2;
                int y = (canvasHeight - vcHeight)/2;
                
                vc.setDisplayLocation(x, y);
            }
        }
....//

Dalla midlet principale viene creato l'oggetto PhotoCanvas e successivamente viene avviato il player tramite la chiamata di startPlayer(), che utilizza una variabile booleana per verificare se il player non sia già attivo (ciò è utile per effettuare il riavvio del player dopo che è stata catturata un'immagine).

Listato 28. Start Player

public void startPlayer()
{
    if (!playerActive)
    {
        try
        {
            if (imageCaptured != null)
            {
                imageCaptured = null;
                if (back != null)
                {
                    removeCommand(back);
                }
            }
            if (player != null)
            {
                player.start();
            }
            if (vc != null)
            {
                vc.setVisible(true);
            }
            playerActive = true;
        }
        catch (MediaException e)
        {
            e.printStackTrace();
        }
    }
}

Nel WTK non esiste un device di cattura come la fotocamera nei telefoni, per cui quando si avvia l'applicazione, nell'emulatore, viene visualizzata una schermata separata in rettangoli che si muovono da destra verso sinistra.

Scattiamo la fotografia

Per scattare la foto utilizziamo il puntatore del terminale: effettuiamo dunque l'override del metodo keyPressed della classe Canvas nel seguente modo:

Listato 29. cattura azione per scattare la foto

protected void keyPressed(int key)
{
    super.keyPressed(key);
    if (getGameAction(key) == Canvas.FIRE)
    {
        SnapshotCapturer capturer = new SnapshotCapturer();
        capturer.start();
    }
}

Al pari dell'operazione di connessione in rete, è opportuno effettuare l'operazione di cattura dell'immagine in un thread separato in modo da non bloccare a lungo la midlet: nel caso specifico usiamo l'oggetto SnapshotCapturer definito internamente alla classe PhotoCanvas:

Listato 30. cattura dell'immagine in un thread esterno

class SnapshotCapturer extends Thread
{
    public void run()
    {
        byte[] photo;
        try
        {
            photo = vc.getSnapshot(null);
            fotodemo.showCapturedPhoto(photo);
        }
        catch (MediaException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

Ti consigliamo anche