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

2 回答 2

2

也许您应该尝试在 captureAndSaveImage() 的 try-catch 块中捕获 OutOfMemoryError(最好捕获 Throwable,它也会捕获它而不是异常)

此外,您可能希望查看 fileName 以确保它尝试保存在正确的目录中

    showAlert("fileName", fileName, this);
    // Open file
于 2012-05-02T07:44:59.047 回答
1

在您使用管理器类 jst 创建播放器的 creatCamera 方法中,尝试捕获模式而不是视频模式。

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

我在 nokia-c1 中遇到了同样的问题。和

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

通过在 getSnapshot 方法中 传递null参数,您将获得设备默认支持的图像格式。

于 2012-09-25T06:11:08.797 回答