How to record video in Java ME
Article Metadata
Here is a sample code showing how to record video and save recorded files to the file system using Java ME:
dcrocha 01:01, 20 October 2007 (UTC)
package example;
import java.io.OutputStream;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.Alert;
import javax.microedition.lcdui.AlertType;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Graphics;
import javax.microedition.media.Manager;
import javax.microedition.media.Player;
import javax.microedition.media.PlayerListener;
import javax.microedition.media.control.RecordControl;
import javax.microedition.media.control.VideoControl;
public class VideoCanvas extends Canvas implements PlayerListener, CommandListener {
private VideoRecordMIDlet midlet = null;
private Command start = new Command("Start",Command.OK,0);
private Command stop = new Command("Stop",Command.OK,1);
private Command exit = new Command("Exit",Command.BACK,0);
private Command play = new Command("Play",Command.OK,2);
private String status = "Not initialized";
private Player player = null;
private VideoControl control = null;
private RecordControl record = null;
private boolean recording = false;
private FileConnection conn = null;
private OutputStream stream = null;
private String PATH = System.getProperty("fileconn.dir.videos") + "vi.3gp";
/**
* Constructor
*
* @param midlet
*/
public VideoCanvas(VideoRecordMIDlet midlet) {
System.out.println(PATH);
this.midlet = midlet;
addCommand(play);
addCommand(start);
addCommand(stop);
addCommand(exit);
setCommandListener(this);
}
public void commandAction(Command c, Displayable arg1) {
if(c == start) {
recording = true;
startRecording();
}
else if(c == stop) {
stop();
recording = false;
}
else if(c == play) {
recording = false;
repaint();
startPlaying();
}
else if(c == exit) {
midlet.notifyDestroyed();
}
}
/**
* Paint
*/
protected void paint(Graphics g) {
g.setColor(0,0,0);
g.fillRect(0,0,getWidth(),getHeight());
}
public void startRecording() {
try {
player = Manager.createPlayer("capture://video");
player.addPlayerListener(this);
player.realize();
//setup recording
record = (RecordControl)player.getControl("RecordControl");
record.setRecordSizeLimit(300000);
conn = (FileConnection)Connector.open(PATH,Connector.READ_WRITE);
if(!conn.exists()) conn.create();
stream = conn.openOutputStream();
record.setRecordStream(stream);
// Grab the video control and set it to the current display.
control = (VideoControl)player.getControl("VideoControl");
if (control != null) {
control.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,this);
control.setDisplaySize(getWidth(),getHeight());
control.setVisible(true);
}
player.start();
record.startRecord();
}
catch(Exception e) {
Alert erro = new Alert("Erro",e.toString(),null,AlertType.ERROR);
Display.getDisplay(midlet).setCurrent(erro);
e.printStackTrace();
}
}
/**
* Start
*
*/
public void startPlaying() {
try {
player = Manager.createPlayer(PATH);
player.addPlayerListener(this);
player.realize();
// Grab the video control and set it to the current display.
control = (VideoControl)player.getControl("VideoControl");
if (control != null) {
control.initDisplayMode(VideoControl.USE_DIRECT_VIDEO,this);
control.setDisplaySize(176,144);
control.setDisplayLocation((getWidth() - control.getDisplayWidth()) / 2,(getHeight() - control.getDisplayHeight()) / 2);
control.setVisible(true);
}
player.start();
}
catch(Exception e) {
Alert erro = new Alert("Erro",e.getMessage(),null,AlertType.ERROR);
Display.getDisplay(midlet).setCurrent(erro);
e.printStackTrace();
}
}
public void stop() {
if(player != null) {
try {
if(recording) {
record.stopRecord();
record.commit();
stream.close();
}
player.stop();
player.deallocate();
player.close();
player = null;
if(recording) {
Alert alert = new Alert("Mensagem","Gravado em " + PATH,null,AlertType.INFO);
Display.getDisplay(midlet).setCurrent(alert,this);
stream = null;
}
if(conn != null)
conn.close();
}
catch(Exception e) {
}
}
}
public void playerUpdate(Player p, String s, Object o) {
if(p.getState() == Player.STARTED) {
status = control.getDisplayHeight() + "=" + control.getDisplayWidth();
setTitle(status);
}
}
}
dcrocha 01:01, 20 October 2007 (UTC)


This article gives complete working code to record video and save recorded files to the file system using J2ME.Implementation of this code example was successful and any one can try it because i have tested it for syntax errors.
--kalki 20:10, 26 September 2009 (UTC)
Quality of Recording????????????
Hi sir, i've used some of your code for saving the file in file system using OutputStream. i m facing a problem that the recorded video is very tiny (in terms of height and width) and quality of it is very low. i think lower than 3gp. can you please tell me what to change in the code to get nearly same quality recording as my 5233's original camera video???? your help will be highly appreciated. thanks in advance.