×
Namespaces

Variants
Actions
(Difference between revisions)

Saving a captured image in Java ME

From Nokia Developer Wiki
Jump to: navigation, search
dekudin (Talk | contribs)
(New page: __NOTOC__ __NOEDITSECTION__ {{CodeSnippet |id=  |platform=S60 3rd Edition, FP2 |devices=Nokia E70 |category=Java ME |subcategory=Camera |creationdate=October 20, 2008 |keywords=javax....)
 
hamishwillee (Talk | contribs)
m (Hamishwillee - Add Abstract. Tidy wiki text)
(19 intermediate revisions by 7 users not shown)
Line 1: Line 1:
__NOTOC__
+
[[Category:Java ME]][[Category:Code Examples]][[Category:MMAPI (JSR-135)]][[Category:Code Snippet]][[Category:Symbian]][[Category:S60 3rd Edition (initial release)]][[Category:S60 3rd Edition FP1]][[Category:S60 3rd Edition FP2]][[Category:Nokia Belle]][[Category:Java Runtime 2.3 for Symbian]][[Category:Series 40 6th Edition FP1]][[Category:Series 40 Developer Platform 2.0]][[Category:Camera]]
__NOEDITSECTION__
+
{{Abstract|This code example demonstrates how to take a picture by camera and save it to file.}}
{{CodeSnippet
+
 
|id= 
+
{{ArticleMetaData <!-- v1.2 -->
|platform=S60 3rd Edition, FP2
+
|sourcecode= [[Media:SavingCapturedImage.zip]]
|devices=Nokia E70
+
|installfile= <!-- Link to installation file (e.g. [[Media:The Installation File.sis]]) -->
|category=Java ME
+
|devices= Nokia E70, Nokia C3-01, Nokia Asha 306, Nokia E7-00
|subcategory=Camera
+
|sdk= [http://www.developer.nokia.com/Develop/Java/ Nokia SDK 1.1 for Java], [http://www.developer.nokia.com/Develop/Java/ Nokia SDK 2.0 for Java (beta)], [http://www.developer.nokia.com/info/sw.nokia.com/id/ec866fab-4b76-49f6-b5a5-af0631419e9c/S60_All_in_One_SDKs.html Nokia Symbian SDKs]<!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Nokia Qt SDK 1.1]) -->
|creationdate=October 20, 2008
+
|platform= Series 40, S60, Nokia Belle
|keywords=javax.microedition.media.Manager, javax.microedition.media.Player, javax.microedition.media.control.VideoControl, javax.microedition.media.Manager.createPlayer, javax.microedition.media.Player.getControl, javax.microedition.media.control.VideoControl.getSnapshot
+
|devicecompatability= <!-- Compatible devices (e.g.: All* (must have GPS) ) -->
 +
|dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 -->
 +
|signing= <!-- Empty or one of Self-Signed, DevCert, Manufacturer -->
 +
|capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. -->
 +
|keywords= javax.microedition.media.Manager, javax.microedition.media.Player, javax.microedition.media.control.VideoControl, javax.microedition.media.Manager.createPlayer, javax.microedition.media.Player.getControl, javax.microedition.media.control.VideoControl.getSnapshot
 +
|language= <!-- Language category code for non-English topics - e.g. Lang-Chinese -->
 +
|translated-by= <!-- [[User:XXXX]] -->
 +
|translated-from-title= <!-- Title only -->
 +
|translated-from-id= <!-- Id of translated revision -->
 +
|review-by= <!-- After re-review: [[User:username]] -->
 +
|review-timestamp= <!-- After re-review: YYYYMMDD -->
 +
|update-by= <!-- After significant update: [[User:username]]-->
 +
|update-timestamp= <!-- After significant update: YYYYMMDD -->
 +
|creationdate= 20081127
 +
|author= [[User:Dekudin]]
 +
<!-- The following are not in current metadata -->
 +
|id= CS001261
 
}}
 
}}
  
 
==Overview==
 
==Overview==
  
This code snippet demonstrates how to take a picture by camera and save it to file.
+
Perform the following steps:
 
+
# Check support of video capturing by calling the {{Icode|System.getProperty}} method with the {{Icode|supports.video.capture}} parameter.
To take a picture by camera and save it to file following steps should be performed:
+
# Call {{Icode|Manager.createPlayer}} method to create a camera player.
# Check support of video capturing by calling <tt>System.getProperty</tt> method with <tt>supports.video.capture</tt> parameter.
+
# Call <tt>Manager.createPlayer</tt> method to create camera player.
+
 
# Initialize and start player.
 
# Initialize and start player.
# Get VideoControl object from player and execute <tt>VideoControl.getSnaphot</tt> method. This method returns array of bytes which represents captured image in specified format.
+
# Get VideoControl object from the player and execute the {{Icode|VideoControl.getSnaphot}} method. This method returns array of bytes which represents captured image in specified format.
# Open file and send array of bytes to it. After this file should be closed.
+
# Open file and send array of bytes to it. After this, the file should be closed.
# On exit from application camera player will be stopped and closed.
+
# On exit from application, the camera player will be stopped and closed.
  
  
Line 35: Line 49:
 
import javax.microedition.lcdui.Command;
 
import javax.microedition.lcdui.Command;
 
import javax.microedition.lcdui.Item;
 
import javax.microedition.lcdui.Item;
 +
import javax.microedition.lcdui.Alert;
  
 
import javax.microedition.media.Manager;
 
import javax.microedition.media.Manager;
Line 43: Line 58:
 
import javax.microedition.io.Connector;
 
import javax.microedition.io.Connector;
 
import javax.microedition.io.file.FileConnection;
 
import javax.microedition.io.file.FileConnection;
 +
 
import java.io.OutputStream;
 
import java.io.OutputStream;
 +
import java.io.IOException;
  
 
public class CaptureAndSaveImage extends MIDlet implements CommandListener {
 
public class CaptureAndSaveImage extends MIDlet implements CommandListener {
Line 62: Line 79:
 
     // Video control of camera
 
     // Video control of camera
 
     private VideoControl videoControl;
 
     private VideoControl videoControl;
 +
 +
    // Alert to be displayed if error occurs.
 +
    private Alert alert;
 
      
 
      
 
     /**
 
     /**
Line 77: Line 97:
  
 
         if(checkCameraSupport() == false) {
 
         if(checkCameraSupport() == false) {
             exitMIDlet();
+
             showAlert("Alert", "Camera is not supported!", null);
 +
            return;
 
         }
 
         }
 
          
 
          
         createCameraForm();
+
         try {
        createCamera();
+
            createCameraForm();
        addCameraToForm();
+
            createCamera();  
 +
            addCameraToForm();
 +
            startCamera();
 +
        } catch(IOException ioExc) {
 +
            showAlert("IO error", ioExc.getMessage(), null);
 +
        } catch(MediaException mediaExc) {
 +
            showAlert("Media error", mediaExc.getMessage(), null);
 +
        }
 
     }
 
     }
 
          
 
          
Line 92: Line 120:
 
         cameraForm = new Form("Camera");
 
         cameraForm = new Form("Camera");
 
         // Create commands for this form
 
         // Create commands for this form
         cmdCapture = new Command("Capture image", Command.SCREEN, 0);
+
         cmdCapture = new Command("Capture", Command.OK, 0);
 
         cmdExit = new Command("Exit", Command.EXIT, 0);
 
         cmdExit = new Command("Exit", Command.EXIT, 0);
 
         // Add commands to form
 
         // Add commands to form
Line 107: Line 135:
 
     private boolean checkCameraSupport() {
 
     private boolean checkCameraSupport() {
 
         String propValue = System.getProperty("supports.video.capture");
 
         String propValue = System.getProperty("supports.video.capture");
         if(propValue == null) {
+
         return (propValue != null) && propValue.equals("true");
            return false;
+
        }
+
        if(propValue.equals("true") == true) {
+
            return true;
+
        }
+
        return false;
+
 
     }     
 
     }     
 
      
 
      
 
     /**
 
     /**
     * Creates camera control and places it to cameraForm.
+
     * Creates camera control and places it to cameraForm.
 
     */
 
     */
 
     private void createCamera() {
 
     private void createCamera() {
        try {
+
try {
            player = Manager.createPlayer("capture://video");
+
    player = Manager.createPlayer("capture://image");
            player.realize();
+
}
            player.prefetch();
+
catch (MediaException e) {
 
+
    try {
            videoControl = (VideoControl)player.getControl("VideoControl");
+
        System.out.println("Couldn't set \"capture://video\"");
        } catch(Exception e) {
+
    player = Manager.createPlayer("capture://video");
            // TODO: handle exception.
+
    }
            exitMIDlet();
+
    catch (MediaException ex) {
        }      
+
   
 +
    }
 +
    catch (IOException ex) {
 +
   
 +
    }
 +
}
 +
catch (IOException e) {
 +
   
 +
}
 +
   
 +
try {
 +
    player.realize();
 +
    player.prefetch();
 +
}
 +
catch (MediaException e) {
 +
   
 +
}
 +
 +
videoControl = (VideoControl)player.getControl("VideoControl");
 
     }
 
     }
 
      
 
      
Line 142: Line 182:
 
     /**
 
     /**
 
     * Start camera player
 
     * Start camera player
 +
    * @throws IOException if starting of player is failed.
 +
    * @throws MediaException if starting of player is failed.
 
     */
 
     */
     private void startCamera() {
+
     private void startCamera() throws IOException, MediaException  {
         try {
+
         if(player.getState() == Player.PREFETCHED) {
            if(player.getState() == Player.PREFETCHED) {
+
            player.start();
                player.start();
+
            }
+
        } catch(Exception e) {
+
            // TODO: handle exception.
+
            exitMIDlet();
+
 
         }
 
         }
 
     }
 
     }
Line 158: Line 195:
 
     */
 
     */
 
     private void captureAndSaveImage() {
 
     private void captureAndSaveImage() {
 +
        FileConnection file = null;
 +
        OutputStream outStream = null;
 +
               
 
         try {
 
         try {
 +
            if(checkPngEncodingSupport() == false) {
 +
                throw new Exception("Png encoding is not supported!");
 +
            }
 +
           
 
             // Capture image
 
             // Capture image
 
             byte[] capturedImageData =  
 
             byte[] capturedImageData =  
                     videoControl.getSnapshot("encoding=jpeg");
+
                     videoControl.getSnapshot("encoding=png");
 
              
 
              
 
             // Get path to photos folder.
 
             // Get path to photos folder.
 
             String dirPhotos = System.getProperty("fileconn.dir.photos");
 
             String dirPhotos = System.getProperty("fileconn.dir.photos");
 
             if(dirPhotos == null) {
 
             if(dirPhotos == null) {
                 throw new NullPointerException("Unable get photos folder name");
+
                 throw new Exception("Unable get photos folder name");
 
             }
 
             }
 
              
 
              
             String fileName = dirPhotos + "CapturedImage.jpg";
+
             String fileName = dirPhotos + "CapturedImage.png";
 
             // Open file
 
             // Open file
             FileConnection file = (FileConnection)Connector.open(fileName,  
+
             file = (FileConnection)Connector.open(fileName,  
 
                     Connector.READ_WRITE);
 
                     Connector.READ_WRITE);
 
             // If there is no file then create it
 
             // If there is no file then create it
Line 178: Line 222:
 
             }
 
             }
 
             // Write data received from camera while making snapshot to file
 
             // Write data received from camera while making snapshot to file
             OutputStream outStream = file.openOutputStream();
+
             outStream = file.openOutputStream();
 
             outStream.write(capturedImageData);
 
             outStream.write(capturedImageData);
             // Close file
+
           
             outStream.close();
+
            showAlert("Info", "Image is saved in " + fileName, cameraForm);
            file.close();
+
           
        } catch(Exception e) {
+
        } catch(IOException ioExc) {
            // TODO: handle exception.
+
            showAlert("IO error", ioExc.getMessage(), cameraForm);
 +
        } catch(MediaException mediaExc) {
 +
            showAlert("Media error", mediaExc.getMessage(), cameraForm);
 +
        } catch(Exception exc) {
 +
            showAlert("Error", exc.getMessage(), cameraForm);
 +
        } finally {
 +
             // Try to close file
 +
             try {
 +
                if(outStream != null) {
 +
                    outStream.close();
 +
                }
 +
                if(file != null) {
 +
                    file.close();
 +
                }
 +
            } catch(Exception exc) {
 +
                // Do nothing
 +
            }
 
         }
 
         }
 
     }     
 
     }     
 +
 +
    /**
 +
    * Checks png encoding support
 +
    * @return true if png encoding is supported false otherwise.
 +
    */
 +
    private boolean checkPngEncodingSupport() {
 +
        String encodings = System.getProperty("video.snapshot.encodings");
 +
        return (encodings != null) && (encodings.indexOf("png") != -1);
 +
    }
 
          
 
          
 
     /**
 
     /**
Line 193: Line 262:
 
     */
 
     */
 
     public void startApp() {
 
     public void startApp() {
         display.setCurrent(cameraForm);
+
         if ( videoControl != null ) {
         startCamera();
+
            display.setCurrent(cameraForm);
 +
         }
 
     }     
 
     }     
 
      
 
      
Line 211: Line 281:
 
         notifyDestroyed();
 
         notifyDestroyed();
 
     }
 
     }
 +
   
 +
    /**
 +
    * Shows alert with specified title and text. If next displayable is not
 +
    * specified then application will be closed after alert closing.
 +
    * @param title - Title of alert.
 +
    * @param message - text of alert.
 +
    * @param nextDisp - next displayable. Can be null.
 +
    */
 +
    private void showAlert(String title, String message, Displayable nextDisp) {
 +
        alert = new Alert(title);
 +
        alert.setString(message);
 +
        alert.setTimeout(Alert.FOREVER);
 +
 +
        if(nextDisp != null) {
 +
            display.setCurrent(alert, nextDisp);
 +
        } else {
 +
            display.setCurrent(alert);
 +
            alert.setCommandListener(this);
 +
        }
 +
    }       
 
      
 
      
 
     /**
 
     /**
Line 218: Line 308:
 
     public void destroyApp(boolean unconditional) {
 
     public void destroyApp(boolean unconditional) {
 
         if(player != null) {
 
         if(player != null) {
             try {
+
             player.deallocate();
                player.stop();
+
            player.close();
                player.deallocate();
+
                player.close();
+
            } catch (MediaException ex) {
+
                // TODO: handle exception
+
            }
+
 
         }
 
         }
 
     }
 
     }
Line 241: Line 326:
 
         // Handles "exit" command from forms
 
         // Handles "exit" command from forms
 
         if(command == cmdExit) {
 
         if(command == cmdExit) {
 +
            exitMIDlet();
 +
        }
 +
        // Handle "ok" command from alert
 +
        if(displayable == alert) {
 
             exitMIDlet();
 
             exitMIDlet();
 
         }
 
         }
Line 247: Line 336:
  
 
</code>
 
</code>
 
  
 
==Postconditions==
 
==Postconditions==
Line 253: Line 341:
 
Camera viewfinder is shown on display.  
 
Camera viewfinder is shown on display.  
  
By choosing "Capture image" menu command user can make a snapshot and save it to CapturedImage.jpg file in photos folder. Image will be saved to file with jpeg encoding.
+
By choosing "Capture image" menu command, the user can take a snapshot and save it to CapturedImage.png file in photos folder. Image will be saved to file with PNG encoding.
  
 
==Supplementary material==
 
==Supplementary material==
  
Executables and source files can be found in [[Media:SavingCapturedImage.zip]]
+
Executables and source files can be found in [[Media:SavingCapturedImage.zip]].
 
+
[[Category:Java ME]][[Category:Code Examples]]
+

Revision as of 09:10, 5 October 2012

This code example demonstrates how to take a picture by camera and save it to file.

Article Metadata
Code ExampleTested with
Devices(s): Nokia E70, Nokia C3-01, Nokia Asha 306, Nokia E7-00
CompatibilityArticle
Keywords: javax.microedition.media.Manager, javax.microedition.media.Player, javax.microedition.media.control.VideoControl, javax.microedition.media.Manager.createPlayer, javax.microedition.media.Player.getControl, javax.microedition.media.control.VideoControl.getSnapshot
Created: dekudin (27 Nov 2008)
Last edited: hamishwillee (05 Oct 2012)

Contents

Overview

Perform the following steps:

  1. Check support of video capturing by calling the System.getProperty method with the supports.video.capture parameter.
  2. Call Manager.createPlayer method to create a camera player.
  3. Initialize and start player.
  4. Get VideoControl object from the player and execute the VideoControl.getSnaphot method. This method returns array of bytes which represents captured image in specified format.
  5. Open file and send array of bytes to it. After this, the file should be closed.
  6. On exit from application, the camera player will be stopped and closed.


Source file: CaptureAndSaveImage.java

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.Item;
import javax.microedition.lcdui.Alert;
 
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;
import javax.microedition.media.MediaException;
 
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
 
import java.io.OutputStream;
import java.io.IOException;
 
public class CaptureAndSaveImage extends MIDlet implements CommandListener {
 
private Display display;
 
// Form where camera viewfinder is placed
private Form cameraForm;
 
// Command for capturing image by camera and saving it.
// Placed in cameraForm.
private Command cmdCapture;
// Command for exiting from midlet. Placed in cameraForm.
private Command cmdExit;
 
// Player for camera
private Player player;
// Video control of camera
private VideoControl videoControl;
 
// Alert to be displayed if error occurs.
private Alert alert;
 
/**
* Constructor.
*/

public CaptureAndSaveImage() {
InitializeComponents();
}
 
/**
* Initializes components of midlet.
*/

private void InitializeComponents() {
display = Display.getDisplay(this);
 
if(checkCameraSupport() == false) {
showAlert("Alert", "Camera is not supported!", null);
return;
}
 
try {
createCameraForm();
createCamera();
addCameraToForm();
startCamera();
} catch(IOException ioExc) {
showAlert("IO error", ioExc.getMessage(), null);
} catch(MediaException mediaExc) {
showAlert("Media error", mediaExc.getMessage(), null);
}
}
 
/**
* Creates and returns form where the camera control will be placed.
*/

private void createCameraForm() {
// Create camera form
cameraForm = new Form("Camera");
// Create commands for this form
cmdCapture = new Command("Capture", Command.OK, 0);
cmdExit = new Command("Exit", Command.EXIT, 0);
// Add commands to form
cameraForm.addCommand(cmdCapture);
cameraForm.addCommand(cmdExit);
// Set midlet as command listener for this form
cameraForm.setCommandListener(this);
}
 
/**
* Check camera support.
* @return true if camera is supported, false otherwise.
*/

private boolean checkCameraSupport() {
String propValue = System.getProperty("supports.video.capture");
return (propValue != null) && propValue.equals("true");
}
 
/**
* Creates camera control and places it to cameraForm.
*/

private void createCamera() {
try {
player = Manager.createPlayer("capture://image");
}
catch (MediaException e) {
try {
System.out.println("Couldn't set \"capture://video\"");
player = Manager.createPlayer("capture://video");
}
catch (MediaException ex) {
 
}
catch (IOException ex) {
 
}
}
catch (IOException e) {
 
}
 
try {
player.realize();
player.prefetch();
}
catch (MediaException e) {
 
}
 
videoControl = (VideoControl)player.getControl("VideoControl");
}
 
/**
* Adds created camera as item to cameraForm.
*/

private void addCameraToForm() {
cameraForm.append((Item)videoControl.
initDisplayMode(VideoControl.USE_GUI_PRIMITIVE, null));
}
 
/**
* Start camera player
* @throws IOException if starting of player is failed.
* @throws MediaException if starting of player is failed.
*/

private void startCamera() throws IOException, MediaException {
if(player.getState() == Player.PREFETCHED) {
player.start();
}
}
 
/**
* Saves image captured by camera.
*/

private void captureAndSaveImage() {
FileConnection file = null;
OutputStream outStream = null;
 
try {
if(checkPngEncodingSupport() == false) {
throw new Exception("Png encoding is not supported!");
}
 
// Capture image
byte[] capturedImageData =
videoControl.getSnapshot("encoding=png");
 
// Get path to photos folder.
String dirPhotos = System.getProperty("fileconn.dir.photos");
if(dirPhotos == null) {
throw new Exception("Unable get photos folder name");
}
 
String fileName = dirPhotos + "CapturedImage.png";
// Open file
file = (FileConnection)Connector.open(fileName,
Connector.READ_WRITE);
// If there is no file then create it
if(file.exists() == false) {
file.create();
}
// Write data received from camera while making snapshot to file
outStream = file.openOutputStream();
outStream.write(capturedImageData);
 
showAlert("Info", "Image is saved in " + fileName, cameraForm);
 
} catch(IOException ioExc) {
showAlert("IO error", ioExc.getMessage(), cameraForm);
} catch(MediaException mediaExc) {
showAlert("Media error", mediaExc.getMessage(), cameraForm);
} catch(Exception exc) {
showAlert("Error", exc.getMessage(), cameraForm);
} finally {
// Try to close file
try {
if(outStream != null) {
outStream.close();
}
if(file != null) {
file.close();
}
} catch(Exception exc) {
// Do nothing
}
}
}
 
/**
* Checks png encoding support
* @return true if png encoding is supported false otherwise.
*/

private boolean checkPngEncodingSupport() {
String encodings = System.getProperty("video.snapshot.encodings");
return (encodings != null) && (encodings.indexOf("png") != -1);
}
 
/**
* From MIDlet.
* Signals the MIDlet that it has entered the Active state.
*/

public void startApp() {
if ( videoControl != null ) {
display.setCurrent(cameraForm);
}
}
 
/**
* From MIDlet.
* Signals the MIDlet to enter the Paused state.
*/

public void pauseApp() {
// TODO: pause player if it is running.
}
 
/**
* Performs exit from midlet.
*/

public void exitMIDlet() {
notifyDestroyed();
}
 
/**
* Shows alert with specified title and text. If next displayable is not
* specified then application will be closed after alert closing.
* @param title - Title of alert.
* @param message - text of alert.
* @param nextDisp - next displayable. Can be null.
*/

private void showAlert(String title, String message, Displayable nextDisp) {
alert = new Alert(title);
alert.setString(message);
alert.setTimeout(Alert.FOREVER);
 
if(nextDisp != null) {
display.setCurrent(alert, nextDisp);
} else {
display.setCurrent(alert);
alert.setCommandListener(this);
}
}
 
/**
* From MIDlet.
* Signals the MIDlet to terminate and enter the Destroyed state.
*/

public void destroyApp(boolean unconditional) {
if(player != null) {
player.deallocate();
player.close();
}
}
 
/**
* From CommandListener.
* Indicates that a command event has occurred on Displayable displayable.
* @param command - a Command object identifying the command.
* @param displayable - the Displayable on which this event has occurred.
*/

public void commandAction(Command command, Displayable displayable) {
// Handles "Capture image" command from cameraForm
if(command == cmdCapture) {
captureAndSaveImage();
}
// Handles "exit" command from forms
if(command == cmdExit) {
exitMIDlet();
}
// Handle "ok" command from alert
if(displayable == alert) {
exitMIDlet();
}
}
}

Postconditions

Camera viewfinder is shown on display.

By choosing "Capture image" menu command, the user can take a snapshot and save it to CapturedImage.png file in photos folder. Image will be saved to file with PNG encoding.

Supplementary material

Executables and source files can be found in Media:SavingCapturedImage.zip.

164 page views in the last 30 days.