2012-05-02 40 views
2

我正在製作一個應用程序,用戶可以在該應用程序中使用相機,捕獲並將該圖像保存到C驅動器,而且當我將這個應用程序與我的PC一起使用時,我也能夠執行所有這些操作。無法使用諾基亞手機拍攝圖像,但在計算機應用程序中工作正常嗎?

但是,每當我在手機上使用這個應用程序就像諾基亞C2-01,02,03我只是查看相機,但無法捕捉圖像總之捕捉不工作,而我用手機來運行這個應用程序。

我的MIDlet的代碼如下,請看到的問題和支持我通過手機拍攝的圖像也: -

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. 
    * @throws IOException if creation of player is failed. 
    * @throws MediaException if creation of player is failed. 
    */ 
    private void createCamera() throws IOException, MediaException { 
     player = Manager.createPlayer("capture://video"); 
     player.realize(); 
     player.prefetch(); 

     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(); 
     } 
    } 
} 

回答

2

也許你應該嘗試捕獲的OutOfMemoryError(還好趕上的Throwable將抓住它也代替在captureAndSaveImage()在try-catch塊除外)的

你也可能想看看文件名,以確保它試圖在適當的目錄保存

showAlert("fileName", fileName, this); 
    // Open file 
+0

惠先生現在我得到PNG不支持...... – user1369219

+0

這意味着,當然,它不支持你的目標設備。然後嘗試jpeg。 –

1

在您的creatCamera方法中使用管理員類jst創建播放器嘗試捕獲模式而不是視頻模式。

player = Manager.createPlayer("capture://image"); 

我在nokia-c1中經歷了同樣的問題。通過傳遞論點getSnapshot方法 而

byte[] capturedImageData = videoControl.getSnapshot(null); 

你會得到回報您設備的默認支持的圖像甲。

相關問題