Not able to capture an image using Nokia Mobile bu

2019-07-19 09:02发布

问题:

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.

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.

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

回答1:

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

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

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


回答2:

In Your creatCamera method at where you are Creating Player with the use of manager class jst try Capture Mode instead of Video mode.

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

I have gone through same problem in nokia-c1. And

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

by passing null argument in getSnapshot method you will get in return a default supported image formate of your device.