多次使用camera.takePicture()时,仅保存最后一张照片

时间:2012-01-09 20:46:19

标签: android android-camera

我认为我的问题在标题中得到了很好的描述。

基本上,我要做的是:

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 个答案:

答案 0 :(得分:2)

对takePicture的调用是异步的,这就是你传入回调的原因,当照片数据准备好时会触发回调。当你连续调用takeFocusedPhoto()时,所有这些都会在第一个takePicture之前被解雇。查看takeFocusedPhoto的方法体,您将类成员变量filename设置为等于name参数。这意味着在jpegCallback被触发之前filename被设置为a,b,c然后d,这意味着你将每张照片保存到d。您将需要一种更好的方法来获取jpegCallback中的文件名。

您可以通过将调用放在jpegCallback中的下一张照片中同步拍摄照片,并只记录您的位置。如果你不知道你将有多少张照片,你可以创建一个数组并使用随机字符串(我在mili中使用时间)在jpeg照片中按需创建文件名,并将文件名添加到数组中以供日后使用。