public class CameraScreen extends MainScreen
{
private VideoControl _videoControl;
private Field _videoField;
private EncodingProperties[] _encodings;
private int _indexOfEncoding = 0;
private ZoomControl _zoomControl;
CameraScreen cameraScreen;
public CameraScreen()
{
cameraScreen= this;
initializeCamera();
initializeEncodingList();
if(_videoField != null)
{
createUI();
}
else
{
add( new RichTextField( "Error connecting to camera." ) );
}
}
protected boolean touchEvent(TouchEvent event)
{
if(event.getEvent() == TouchEvent.GESTURE)
{
TouchGesture gesture = event.getGesture();
if(gesture.getEvent() == TouchGesture.SWIPE)
{
final int direction = gesture.getSwipeDirection();
UiApplication.getApplication().invokeLater(new Runnable()
{
public void run()
{
if(direction == TouchGesture.SWIPE_NORTH)
{
_zoomControl.setDigitalZoom(ZoomControl.NEXT);
}
else if(direction == TouchGesture.SWIPE_SOUTH)
{
_zoomControl.setDigitalZoom(ZoomControl.PREVIOUS);
}
}
});
return true;
}
}
return false;
}
public void takePicture()
{
try
{
String encoding = null;
if( _encodings != null )
{
encoding = _encodings[_indexOfEncoding].getFullEncoding();
}
createImageScreen( _videoControl.getSnapshot( encoding ) );
}
catch(Exception e)
{
}
}
protected boolean onSavePrompt()
{
return true;
}
/**
* Initializes the Player, VideoControl and VideoField
*/
private void initializeCamera()
{
try
{
Player player = Manager.createPlayer( "capture://video" );
player.realize();
_videoControl = (VideoControl)player.getControl( "VideoControl" );
if (_videoControl != null)
{
_videoField = (Field) _videoControl.initDisplayMode (VideoControl.USE_GUI_PRIMITIVE, "net.rim.device.api.ui.Field");
_videoControl.setDisplayFullScreen(true);
_videoControl.setVisible(true);
}
player.start();
}
catch(Exception e)
{
}
}
/**
* Initialize the list of encodings
*/
private void initializeEncodingList()
{
try
{
String encodingString = System.getProperty("video.snapshot.encodings");
String[] properties = StringUtilities.stringToKeywords(encodingString);
Vector encodingList = new Vector();
String encoding = "encoding";
String width = "width";
String height = "height";
EncodingProperties temp = null;
for(int i = 0; i < properties.length ; ++i)
{
if( properties[i].equals(encoding))
{
if(temp != null && temp.isComplete())
{
// Add a new encoding to the list if it has been
// properly set.
encodingList.addElement( temp );
}
temp = new EncodingProperties();
// Set the new encoding's format
++i;
temp.setFormat(properties[i]);
}
else if( properties[i].equals(width))
{
// Set the new encoding's width
++i;
temp.setWidth(properties[i]);
}
else if( properties[i].equals(height))
{
// Set the new encoding's height
++i;
temp.setHeight(properties[i]);
}
}
// If there is a leftover complete encoding, add it.
if(temp != null && temp.isComplete())
{
encodingList.addElement( temp );
}
// Convert the Vector to an array for later use
_encodings = new EncodingProperties[ encodingList.size() ];
encodingList.copyInto((Object[])_encodings);
}
catch (Exception e)
{
// Something is wrong, indicate that there are no encoding options
_encodings = null;
}
}
/**
* Adds the VideoField to the screen
*/
private void createUI()
{
// Add the video field to the screen
add(_videoField);
}
/**
* Create a screen used to display a snapshot
* @param raw A byte array representing an image
*/
private void createImageScreen( byte[] raw )
{
UiApplication.getUiApplication().popScreen(cameraScreen);
ImageScreen imageScreen = new ImageScreen( raw );
UiApplication.getUiApplication().pushScreen( imageScreen );
}
/**
* Sets the index of the encoding in the 'encodingList' Vector
* @param index The index of the encoding in the 'encodingList' Vector
*/
public void setIndexOfEncoding(int index)
{
_indexOfEncoding = index;
}
/**
* @see net.rim.device.api.ui.Screen#invokeAction(int)
*/
protected boolean invokeAction(int action)
{
boolean handled = super.invokeAction(action);
if(!handled)
{
switch(action)
{
case ACTION_INVOKE: // Trackball click
{
takePicture();
return true;
}
}
}
return handled;
}
}
public static class ImageScreen extends MainScreen
{
private static final int IMAGE_SCALING = 7;
private static String FILE_NAME = System.getProperty("fileconn.dir.photos") + "IMAGE";
private static String EXTENSION = ".bmp";
private static int _counter;
private ImageScreen _imageScreen;
public ImageScreen( final byte[] raw )
{
_imageScreen = this;
setTitle("IMAGE");
Bitmap image = Bitmap.createBitmapFromBytes( raw, 0, -1, IMAGE_SCALING );
HorizontalFieldManager hfm1 = new HorizontalFieldManager( Field.FIELD_HCENTER );
HorizontalFieldManager hfm2 = new HorizontalFieldManager( Field.FIELD_HCENTER );
BitmapField imageField = new BitmapField( image );
hfm1.add( imageField );
ButtonField photoButton = new ButtonField( "Save" );
photoButton.setChangeListener( new SaveListener(raw) );
hfm2.add(photoButton);
ButtonField cancelButton = new ButtonField( "Cancel" );
cancelButton.setChangeListener( new CancelListener() );
hfm2.add(cancelButton);
add( hfm1 );
add( hfm2 );
}
protected boolean invokeAction(int action)
{
boolean handled = super.invokeAction(action);
if(!handled)
{
switch(action)
{
case ACTION_INVOKE: // Trackball click.
{
return true;
}
}
}
return handled;
}
private class SaveListener implements FieldChangeListener
{
private byte[] _raw;
SaveListener(byte[] raw)
{
_raw = raw;
}
public void fieldChanged(Field field, int context)
{
try
{
FileConnection file = (FileConnection)Connector.open( FILE_NAME + _counter + EXTENSION );
while( file.exists() )
{
file.close();
++_counter;
file = (FileConnection)Connector.open( FILE_NAME + _counter + EXTENSION );
}
file.create();
OutputStream out = file.openOutputStream();
out.write(_raw);
out.close();
file.close();
}
catch(Exception e)
{
}
String full_path = FILE_NAME + _counter + EXTENSION;
setOnBitmapField(full_path);
selectedImagePath= full_path;
++_counter;
UiApplication.getUiApplication().popScreen( _imageScreen );
}
}
private class CancelListener implements FieldChangeListener
{
public void fieldChanged(Field field, int context)
{
UiApplication.getUiApplication().popScreen( _imageScreen );
}
}
}
=======
public final class EncodingProperties
{
private String _format;
private String _width;
private String _height;
private boolean _formatSet;
private boolean _widthSet;
private boolean _heightSet;
public void setFormat(String format)
{
_format = format;
_formatSet = true;
}
public void setWidth(String width)
{
_width = width;
_widthSet = true;
}
public void setHeight(String height)
{
_height = height;
_heightSet = true;
}
public String toString()
{
StringBuffer display = new StringBuffer();
display.append(_width);
display.append(" x ");
display.append(_height);
display.append(" ");
display.append(_format);
return display.toString();
}
public String getFullEncoding()
{
StringBuffer fullEncoding = new StringBuffer();
fullEncoding.append("encoding=");
fullEncoding.append(_format);
fullEncoding.append("&width=");
fullEncoding.append(_width);
fullEncoding.append("&height=");
fullEncoding.append(_height);
return fullEncoding.toString();
}
public boolean isComplete()
{
return _formatSet && _widthSet && _heightSet;
}
}