DisplayCanvas类的作为就是将接受自MIDlet的字节数组转变成图像并显示在屏幕上。
//unnamed package import javax.microedition.lcdui.*; class DisplayCanvas extends Canvas implements CommandListener{ private final CameraMIDletmidlet; private Image image=null; DisplayCanvas(CameraMIDlet midlet) { this.midlet=midlet; addCommand(newCommand("Back",Command.BACK,1)); setCommandListener(this); } public void paint(Graphicsg) { g.setColor(0x0000FFFF);//cyan g.fillRect(0,0,getWidth(),getHeight()); if(image!=null) { g.drawImage(image, getWidth()/2, getHeight()/2, Graphics.VCENTER|Graphics.HCENTER); } } void setImage(byte[]pngImage) { image=Image.createImage(pngImage,0,pngImage.length); } public void commandAction(Commandc,Displayabled) { midlet.displayCanvasBack(); } } |
应用程序描述符(camera.jad)
Camera MIDlet的应用程序描述符仅仅是简单的将MIDlet描述加入到托管域中。
MIDlet-Description:CameraMIDlet
0MIDlet-Jar-Size:4186
MIDlet-Jar-URL:camera.jar
MIDlet-Name:Camera
MIDlet-Vendor: Forum Nokia
MIDlet-Version:0.4
Manifest
Manifest包括了加入描述的托管域和一个icon()函数:
MIDlet-Name:Camera
MIDlet-Version:0.4
MIDlet-Vendor:Forum Nokia
MIDlet-Description:Camera
MIDletMIDlet-Icon:/camera.png
MicroEdition-Profile:MIDP-1.0
MicroEdition-Configuration:CLDC-1.0
MIDlet-1:Camera,/camera.png,CameraMIDlet
使用VideoControl表单
CameraCanvas类常用来显示采集到的图像,他所起的作用与常见的表单大致相同,一旦执行它就将取代CameraCanvas(对CameraMIDlet作了很少的微不足道的修改),代码片断如下:
CameraForm类
//unnamed package import javax.microedition.lcdui.*; import javax.microedition.media.*; import javax.microedition.media.control.*; import java.io.IOException; class CameraForm extends Form implements CommandListener{ private final FormCameraMIDlet midlet; private final Command exitCommand; private Command captureCommand=null; private Player player; private VideoControl videoControl; private Boolean active=false; private StringItem messageItem; CameraForm(FormCameraMIDlet midlet) { super("Camera"); this.midlet=midlet; messageItem=newStringItem("Message","start"); append(messageItem); exitCommand=newCommand("Exit",Command.EXIT,1); addCommand(exitCommand); setCommandListener(this); //initialize camera try{ player=Manager.createPlayer("capture://video"); player.realize(); //Grab the video control and set it to the current display. videoControl=(VideoControl)(player.getControl("VideoControl")); if(videoControl!=null) { append((Item)(videoControl.initDisplayMode( VideoControl.USE_GUI_PRIMITIVE,null))); captureCommand=newCommand("Capture",Command.SCREEN,1);
addCommand(captureCommand); messageItem.setText("OK"); } else{ messageItem.setText("Novideocontrol"); } } catch(IOExceptionioe) { messageItem.setText("IOException:"+ioe.getMessage()); } catch(MediaExceptionme) { messageItem.setText("MediaException"+me.getMessage()); } catch(SecurityExceptionse) { messageItem.setText("Securityexception:"+se.getMessage()); } } synchronizedvoidstart() { if(!active) { try{ if(player!=null) { player.start(); } if(videoControl!=null) { videoControl.setVisible(true); } } catch(MediaExceptionme) { messageItem.setText("Mediaexception:"+me.getMessage()); } catch(SecurityExceptionse) { messageItem.setText("Securityexception:"+se.getMessage()); } active=true; } } synchronizedvoidstop() { if(active) { try{ if(videoControl!=null) { videoControl.setVisible(false); }
if(player!=null) { player.stop(); } } catch(MediaExceptionme) { messageItem.setText("Mediaexception:"+me.getMessage()); } active=false; } } public void commandAction(Commandc,Displayabled) { if(c==exitCommand) { midlet.cameraFormExit(); } elseif(c==captureCommand) { //if we have a capture command,we know videoControlisnotnulltry{ byte[]pngImage=videoControl.getSnapshot(null); midlet.cameraFormCaptured(pngImage); messageItem.setText("OK"); } catch(MediaExceptionme) { messageItem.setText("Mediaexception:"+me.getMessage()); } } } } |
结束语
本文提供的MIDlet仅仅是一个实例,在实践中可以扩展这个实例。首先在实践中可以将图像存储起来,然后在其他屏幕浏览这些图像,这是一个非常有意思的做法。另外还可以将图像以HTTP方式传送到WEB服务器上,然后可以将这些图像动态的加入用户的WEB日志中,MIDlet也允许用户将带文本的图像传送到WEB站点。