2

ユーザーがカメラを使用し、その画像をキャプチャしてCドライブに保存できるアプリケーションを作成しています。また、このアプリケーションをPCで使用すると、これらすべてを実行できます。

しかし、Nokia 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 に答える