Только последняя фотография сохраняется при многократном использовании camera.takePicture () - PullRequest
3 голосов
/ 10 января 2012

Я думаю, что моя проблема достаточно хорошо описана в заголовке.

По сути, я пытаюсь сделать следующее:

takeFocusedPhoto("a");
doSomethingElse();
takeFocusedPhoto("b");
doSomethingElse();
takeFocusedPhoto("c");
doSomethingElse();
takeFocusedPhoto("d");

Но мой код может сохранить только последний (d.jpg).

doSomethingElse () на самом деле является функцией поворота платформы, на которой стоит мой сотовый телефон (я хочу сфотографировать каждую стену в комнате.

Есть ли простой способ это исправить? Буду признателен за любую помощь или предложение.

код:

/** Takes photo with default settings */
public void takePhoto(){

    camera.startPreview();

    camera.takePicture(null, rawCallback, jpegCallback);

    camera.stopPreview();

}
/** Takes photo using Auto Focus function */
public void takeFocusedPhoto(String name){

    filename=name;
    isAutoFocused=false;
    camera.startPreview();

        AutoFocusClbk afcb = new AutoFocusClbk();
        camera.autoFocus(afcb);

        if(isAutoFocused){
            Log.d(TAG, "takeFocusedPhoto - AutoFocused");   
        }
        else{

            Log.d(TAG, "takeFocusedPhoto - NOT AutoFocused");

        }

        camera.takePicture(null, rawCallback, jpegCallback);


    camera.stopPreview();

}
/** Releases the interface */
public void closeCamera(){

    camera.release();

}
/** Shutter */
/*ShutterCallback shutterCallback = new ShutterCallback() {
    public void onShutter() {
        Log.d(TAG, "onShutter'd");
    }
};*/

/** Handles data for raw picture */
PictureCallback rawCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        Log.d(TAG, "onPictureTaken - RAW");
    }
};
/** Handles data for jpeg picture */
PictureCallback jpegCallback = new PictureCallback() {
    public void onPictureTaken(byte[] data, Camera camera) {
        FileOutputStream outStream = null;
        try {
            //write the file to sdcard
            outStream = new FileOutputStream(String.format("/sdcard/"+filename+".jpg"));    
            outStream.write(data);
            outStream.close();
            Log.d(TAG, "onPictureTaken - SUCCESS! - wrote bytes: " + data.length);
        } catch (FileNotFoundException e) {
            Log.d(TAG, "onPictureTaken - FAILURE - FileNotFound");
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
        }
        Log.d(TAG, "onPictureTaken - JPEG");
    }
};
/** AutoFocus Callback */
private class AutoFocusClbk implements Camera.AutoFocusCallback{

    public void onAutoFocus(boolean success, Camera camera){

        isAutoFocused = success;
        Log.d(TAG, "onAutoFocus - AutoFocused: "+success);
    }

};
}

1 Ответ

2 голосов
/ 10 января 2012

Вызов takePicture является асинхронным, поэтому вы передаете обратный вызов, который запускается, когда данные фотографии готовы. Когда вы вызываете takeFocusedPhoto () спина к спине, все они запускаются ДО того, как произойдет первый взятие takePicture. Глядя на тело метода takeFocusedPhoto, вы устанавливаете переменную члена класса filename, равную аргументу имени. Это означает, что filename устанавливается в a, b, c, а затем в d, прежде чем jpegCallback будет запущен, что означает, что вы сохраняете каждую фотографию в d. Вам понадобится лучший способ получить имя файла в jpegCallback.

Вы можете сделать фотографии синхронно, сделав вызов следующей фотографии в jpegCallback и просто вести учет того, где вы находитесь. Если вы не знаете, сколько фотографий у вас будет, вы можете создать массив и создать имя файла по запросу в jpeg photo, используя случайную строку (я использую время в мили), и добавить имя файла в массив для использования позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...