无法使用诺基亚移动电话捕获图像,但是在“计算机"应用程序中工作正常吗? [英] Not able to capture an image using Nokia Mobile but in Computer application works fine?

查看:114
本文介绍了无法使用诺基亚移动电话捕获图像,但是在“计算机"应用程序中工作正常吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个应用程序,在该应用程序中,用户将能够使用相机,捕获该图像并将其保存到C驱动器,并且当我在PC上使用该应用程序时,我还能够执行所有这些操作.

I am making an application in which user will be able to use camera, capture and save that image to C drive, and i am also able to perform all these when i use this application with my PC.

但是,每当我在移动设备上使用此应用程序时(如诺基亚C2-01、02、03),当我使用移动设备运行此应用程序时,我只能查看相机,但无法在短时间内捕获图像.

But whenever i use this application in mobile Like Nokia C2-01,02,03 i am only to view camera but not able to capture an image in short capture is not working while i use Mobile to run this App.

下面是我的Midlet代码,请查看问题并也支持我通过Mobile捕获图像:-

My Midlet code is below please see the problem and support me to capture image via Mobile also:-

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

推荐答案

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

Maybe you should try to capture an OutOfMemoryError (better to catch Throwable which will catch it too instead of an Exception) in try-catch block at captureAndSaveImage()

另外,您可能希望看到fileName来确保它试图保存在正确的目录中

Also you might want to see fileName to make sure it tries to save in proper directory

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

这篇关于无法使用诺基亚移动电话捕获图像,但是在“计算机"应用程序中工作正常吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆