Tomar una fotografía en una aplicación del dispositivo BlackBerry

  1. Importe las clases y las interfaces necesarias.
    import net.rim.device.api.amms.control.camera.*;
    import net.rim.device.api.ui.*;
    import net.rim.device.api.ui.component.*;
    import net.rim.device.api.ui.container.*;
    import javax.microedition.media.*;
    import javax.microedition.media.control.*;
  2. Cree el marco de la aplicación ampliando la clase UiApplication. En main(), cree una instancia de la clase nueva e invoque enterEventDispatcher() para activar la aplicación para recibir eventos. En el constructor de la aplicación, invoque pushScreen() para mostrar la pantalla personalizada para la aplicación. La clase ImageCaptureDemoScreen, que se describe en el paso 3, representa la pantalla personalizada.
    public class ImageCaptureDemo extends UiApplication
    {
         public static void main(String[] args)
         {
              ImageCaptureDemo app = new ImageCaptureDemo();
              app.enterEventDispatcher();
         }
         public ImageCaptureDemo()
         {
              pushScreen(new ImageCaptureDemoScreen());
         }
    }
  3. Cree el marco para la pantalla personalizada ampliando la clase MainScreen. Defina variables de clase para las clases Player y VideoControl que cree en el constructor de la pantalla, como se describe en el paso 5.
    class ImageCaptureDemoScreen extends MainScreen
    {	
        Player _p;
        VideoControl _videoControl;    
        public ImageCaptureDemoScreen()
        {
        }
    }
  4. En el constructor de la pantalla, inicie la cámara. En un bloque try/catch, cree una instancia de la clase Player invocando Manager.createPlayer(String) y pasando el parámetro de codificación. Los parámetros jpeg y image/jpeg son compatibles. Si no especifica el parámetro de codificación, de forma predeterminada, el parámetro de codificación es image/jpeg.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer(
                    "capture://video?encoding=jpeg" +
                    "&width=1024&height=768");
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  5. Para controlar un aspecto al tomar la fotografía, recupere el objeto Control correspondiente. Invoque el método Player del objeto realize() para acceder al objeto Control asociado. A continuación, invoque Player.getControl() para recuperar el Player del objeto VideoControl.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer(
                    "capture://video?encoding=jpeg" +
                    "&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  6. Cree un visor en su aplicación invocando VideoControl.initDisplayMode(int mode, Object arg) para inicializar el modo que utiliza un campo de vídeo. Pase un parámetro para especificar la primitiva de IU que muestra la imagen. Asigne el objeto devuelto como objeto Field. Invoque VideoControl.setDisplayFullScreen(true) para ajustar el visor a la pantalla completa del dispositivo. Invoque VideoControl.setVisible(true) para mostrar el visor.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer(
                    "capture://video?encoding=jpeg" +
                    "&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
        if (videoControl != null)
        {
            Field videoField = (Field) _videoControl.initDisplayMode(
                   VideoControl.USE_GUI_PRIMITIVE,
                   "net.rim.device.api.ui.Field");
            _videoControl.setDisplayFullScreen(true);
            _videoControl.setVisible(true);
        }
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  7. Invoque Player.start() para establecer el reproductor en el estado STARTED.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
        if (videoControl != null)
        {
            Field videoField = (Field) _videoControl.initDisplayMode(
                   VideoControl.USE_GUI_PRIMITIVE,
                   "net.rim.device.api.ui.Field");
            _videoControl.setDisplayFullScreen(true);
            _videoControl.setVisible(true);
            _p.start();
        }
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  8. Para activar el autoenfoque de la cámara, invoque Player.getContol() para recuperar la interfaz Player del objeto EnhancedFocusControl. Invoque EnhancedFocusControl.startAutoFocus(). Si el dispositivo BlackBerry no admite el autoenfoque, startAutoFocus() no tendrá efecto.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
        if (videoControl != null)
        {
            Field videoField = (Field) _videoControl.initDisplayMode(
                   VideoControl.USE_GUI_PRIMITIVE,
                   "net.rim.device.api.ui.Field");
            _videoControl.setDisplayFullScreen(true);
            _videoControl.setVisible(true);
            _p.start();
            EnhancedFocusControl efc = (EnhancedFocusControl)p.getControl(
                   "net.rim.device.api.amms.control.camera.EnhancedFocusControl");
            if(efc != null)
            {
                efc.startAutoFocus();
            }
        }    
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  9. Compruebe que videoField no sea null e invoque add() para agregar el visor a la pantalla.
    try 
    {
        _p = javax.microedition.media.Manager.createPlayer("capture://video?encoding=jpeg&width=1024&height=768");
        _p.realize();
        _videoControl = (VideoControl) _p.getControl("VideoControl");
        if (videoControl != null)
        {
            Field videoField = (Field) _videoControl.initDisplayMode(
                   VideoControl.USE_GUI_PRIMITIVE,
                   "net.rim.device.api.ui.Field");
            _videoControl.setDisplayFullScreen(true);
            _videoControl.setVisible(true);
            _p.start();
            EnhancedFocusControl efc = (EnhancedFocusControl)p.getControl(
                   "net.rim.device.api.amms.control.camera.EnhancedFocusControl");
            efc.startAutoFocus();
            if(videoField != null)
            {
                add(videoField);
            }
        }
    }
    catch(Exception e)
    {
        Dialog.alert(e.toString());
    }
  10. En ImageCaptureDemoScreen, invoque net.rim.device.api.ui.Screen.invokeAction(). Esta implementación toma la fotografía cuando el usuario hace clic en el panel táctil, la bola de desplazamiento o la pantalla táctil. Devuelva un boolean que indique si la acción se ha realizado.
    protected boolean invokeAction(int action)
    {
        boolean handled = super.invokeAction(action); 
        if(!handled)
        {
            if(action == ACTION_INVOKE)
            {                         
            }
        }  
        return handled;                
    }
  11. En la declaración if(action == ACTION_INVOKE), en un bloque try/catch, invoque VideoControl.getSnapshot() para tomar la fotografía, pasando null para utilizar la configuración de codificación que ha especificado en el paso 4. La fotografía se devuelve como una matriz byte.
    protected boolean invokeAction(int action)
    {
        boolean handled = super.invokeAction(action); 
        if(!handled)
        {
            if(action == ACTION_INVOKE)
            {   
                try
                {                      
                    byte[] rawImage = _videoControl.getSnapshot(null);        
                }
                catch(Exception e)
                {
                    Dialog.alert(e.toString());
                }
            }
        }           
        return handled;                
    }

¿Le ha resultado útil esta información? Envíenos sus comentarios.