?? powercamera.java
字號:
package com.j2medev.ch8.mmapi;import java.io.IOException;import javax.microedition.midlet.*;import javax.microedition.lcdui.*;import javax.microedition.media.*;import javax.microedition.media.control.VideoControl;public class PowerCamera extends MIDlet implements CommandListener{ private Display display = null; private Displayable resume = null; private List main = null; private PowerModel pm = null; private Player player = null; private VideoControl vc = null; public CaptureThread captureThread=null; private Command exitCommand = new Command("退出",Command.EXIT, 1); private Command captureCommand = new Command("拍照",Command.OK, 1); private Command backCommand = new Command("返回",Command.BACK, 1); public PowerCamera() { captureThread=new CaptureThread(); } public void showPlayerState(){ if(player==null)return; int state=player.getState(); switch(state){ case Player.CLOSED:{ System.out.println("player=LOSED"); break; } case Player.PREFETCHED:{ System.out.println("player=PREFETCHED"); break; } case Player.REALIZED:{ System.out.println("player=REALIZED"); break; } case Player.STARTED:{ System.out.println("player=STARTED"); break; } case Player.UNREALIZED:{ System.out.println("player=UNREALIZED"); break; } default: break; } } public void startApp() { if(display == null){ display = Display.getDisplay(this); pm = new PowerModel(this); main = new List("主菜單", List.IMPLICIT, new String[]{"手機拍照","我的相冊"}, null); main.addCommand(exitCommand); main.setCommandListener(this); resume = main; } display.setCurrent(resume); } public void setCurent(Displayable current){ display.setCurrent(current); } public void pauseApp() { resume = display.getCurrent(); } public void destroyApp(boolean unconditional) { //退出程序,釋放資源 pm.release(); releasePlayer(); } public Display getDisplay() { return display; } public void showCamera(){ boolean initFlag=true; try{ //創建播放器 if(player == null){ player = Manager.createPlayer("capture://video"); } //System.out.println(player.getState()); this.showPlayerState(); if(player.getState()==Player.STARTED)player.deallocate(); if(player.getState()==Player.UNREALIZED) player.realize(); //獲得VideoControl if(vc==null) { vc = (VideoControl)player.getControl("VideoControl"); initFlag=true; }else initFlag=false; //將捕獲的數據繪制到Canvas上 CameraCanvas cc = new CameraCanvas(this, vc,initFlag); cc.addCommand(captureCommand); cc.addCommand(backCommand); cc.setCommandListener(this); display.setCurrent(cc); player.start(); }catch(IOException ex){ ex.printStackTrace(); player =null; vc = null; } catch(MediaException ex){ ex.printStackTrace(); player =null; vc = null; } } public void capture(){ try{ //捕獲數據 可以通過參數定制編碼類型以及圖片的長度和高度 byte[] imgData = vc.getSnapshot("encoding=jpeg&width=160&height=120"); ViewImageUI vimage = new ViewImageUI(this, imgData); //顯示圖片,并讓用戶輸入標題 display.setCurrent(vimage); //player.close(); //player = null; //vc = null; }catch(MediaException ex){ showInfo(ex.toString(),AlertType.ERROR); } } public void backToMain(){ display.setCurrent(main); } public void savePicture(Picture pic){ pm.savePicture(pic); } //錯誤提示 public void showInfo(String message,AlertType type){ Alert alert = new Alert("系統提示"); alert.setString(message); alert.setTimeout(2000); alert.setType(type); display.setCurrent(alert, main); } //處理和用戶交互的邏輯 public void commandAction(Command cmd,Displayable displayable){ if(cmd == exitCommand){ this.captureThread.stop(); this.captureThread=null; this.releasePlayer(); destroyApp(false); notifyDestroyed(); }else if(cmd == List.SELECT_COMMAND){ String label = main.getString(main.getSelectedIndex()); if(label.equals("手機拍照")){ //判斷是否支持MMAPI String support = PowerModel.isVideoCapture(); if(support.equals("true")){ showCamera(); if(captureThread==null){ System.out.println("captureThread=null"); captureThread=new CaptureThread(); } //if(captureThread.isAlive()) System.out.println(captureThread.isAlive()); captureThread.start(); System.out.println(captureThread.isAlive()); }else{ showInfo("您的手機不支持拍照功能",AlertType.WARNING); } }else if(label.equals("我的相冊")){ //一次讀取Picture[]數組,這里對內存消耗很大 Picture[] pic = pm.getAllPicture(); if(pic == null){ showInfo("相冊為空", AlertType.INFO); }else{ ImageList list = new ImageList(this); list.initTitle(pic); display.setCurrent(list); } } }else if(cmd == captureCommand){ try { captureThread.StartCapture(); } catch (Exception e) { e.printStackTrace(); } // capture(); }else if(cmd == backCommand){ releasePlayer(); captureThread.stop(); this.captureThread=null; backToMain(); } } //把播放器資源釋放,系統可能需要使用 public void releasePlayer(){ if(player != null){ player.close(); player = null; }if(vc != null){ vc = null; } } public class CaptureThread extends Thread{ private boolean stop = false; //private boolean CaptureDone = false; public CaptureThread() { stop = false; } public void run() { while (!stop) { synchronized(this){ try { System.out.println("captureThread等待....."); wait(); } catch (InterruptedException ex) { ex.printStackTrace(); } } if(stop==true)break; capture(); } } public synchronized void StartCapture(){ System.out.println("StartCapture 喚醒captureThread"); notify(); } public synchronized void stop(){ this.stop=true; System.out.println("stop"); notify(); } }}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -